You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符数组复制:数组与指针方式的终止符差异咨询

为什么指针版字符数组复制有时候不用手动加'\0'?

嘿,这个问题其实挺容易搞混的,我来给你掰扯清楚~首先得澄清一个点:不是所有指针版复制都不用加终止符,关键看你的指针循环是怎么写的,我们一步步拆解:

先看你的下标循环版本

你的代码写得很规范:while循环只把source里的有效字符(也就是'\0'之前的那些)复制到temp里,循环结束时i刚好指着temp里对应source中'\0'的位置,这时候必须手动加temp[i]='\0'——不然temp就不是一个合法的C风格字符串,cout输出的时候会乱读内存里的垃圾数据,直到碰巧碰到某个'\0'才停下。

再贴一遍你的代码方便对比:

char source[50] = "Hello World";
char temp[50];
int i = 0;
while (source[i] != '\0') {
    temp[i] = source[i];
    i++;
}
temp[i]='\0'; // 必须加,不然输出会乱
cout << temp;

再看你说的“不用加'\0'”的指针版本

你提到的指针版不用加终止符,大概率是用了一种比较巧妙的循环写法,比如这样:

char source[50] = "Hello World";
char temp[50];
char *dest_ptr = temp;
char *src_ptr = source;

// 重点是这个循环!
while (*dest_ptr++ = *src_ptr++);

cout << temp;

核心原因就在这个循环里

这个循环的条件是*dest_ptr++ = *src_ptr++——这是个赋值表达式,它的返回值就是被赋值的内容(也就是*src_ptr当前的值)。当*src_ptr走到'\0'的时候,这个赋值表达式的值就是'\0',会被当成false终止循环,但在终止之前,已经把'\0'赋值给了*dest_ptr,然后两个指针才各自往后挪了一位。

说白了,这个循环连source里的'\0'一起复制到temp里了,自然就不用手动加了~

但如果是和下标版逻辑完全一致的指针写法,还是得加'\0'

要是你把下标循环直接改成指针版,比如这样:

char source[50] = "Hello World";
char temp[50];
char *dest_ptr = temp;
char *src_ptr = source;

while (*src_ptr != '\0') {
    *dest_ptr = *src_ptr;
    dest_ptr++;
    src_ptr++;
}
// 这里必须手动加!不然temp没终止符
*dest_ptr = '\0';

cout << temp;

这种写法和你的下标版逻辑一模一样,循环只复制有效字符,所以同样得手动补'\0'才行。

总结一下

  • 下标版和逻辑完全等价的指针版都需要手动加'\0',因为它们只处理了非'\0'的有效字符
  • 你看到的“不用加”的指针版,是利用了赋值表达式的特性,把source里的'\0'也一起复制了,所以省了手动加的步骤

内容的提问来源于stack exchange,提问作者MarionaGlenni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:16:40