C 指针到阵列

C++ Pointers to arrays

本文关键字:阵列 指针      更新时间:2023-10-16
#include <stdio.h>
char strA[80] = "A string to be used for demonstration purposes";
char strB[80];
char *my_strcpy(char *destination, char *source)
{
   char *p = destination;
   while (*source != '')
   {
       *p++ = *source++;
   }
   *p = '';
   return destination;
} 
int main(void)
{
    my_strcpy(strB, strA);
    puts(strB);
 }   

所以我的问题是,当我拿出部分时: //*p =' 0';
它打印了完全相同的答案,那为什么需要这呢?从我的理解来看, 0是字符串之后的一个无数内存的部分

看来您已经知道零终端的重要性,但是重点是,您在外部命名空间中定义了char strB[80];(带有静态寿命),这是由于数组strB的初始化,将其所有字节设置为零。这就是为什么您无法观察到差异的原因,因为即使您不附加null字符,strB的其余部分也是)。

移动strB的定义使此可见。strA不需要移动,因为它无关紧要。

实际上,此代码

while (*source != '')
{
    *p++ = *source++;
}
// *p = '';

*source到达无效字符时,它未复制到*p ,因此您需要为此添加一个终结器。

看到时,您的循环停止,因此未复制到目的地,并且目的地未终止。这是一个问题吗?

  • 如果您的目标缓冲区被初始化为所有0
  • 如果您的代码愿意处理固定长度字符串(因此my_strcpy签名需要更改以返回长度)
  • 一般 - 0终止的C字符串是一种常见的事情,不遵循约定的是要麻烦,

您是否0终止,其余值将与您启动时相同。0终止仅使您的角色数组成为"标准C字符串"。

出于争论的缘故:假设您知道每个字符串都有80个字符的空间,您可以做

for(int i = 0; i < 80; i++)
{
    dest[i] = src[i];
}

效果是相同的,假设源为0终止,目的地也将是。