指向字符串的指针在函数中是如何工作的

How a pointer to a string works in a function?

本文关键字:何工作 工作 字符串 指针 函数      更新时间:2023-10-16

我正在学习指针和字符串以及它们的工作方式。我有一个问题,我可能已经知道答案了。但事实上,我想确定一下。以以下代码为例:

char a[200],*p;
gets(a); // cin.get(a,200);
p=a;
strcpy(p,p+1);
printf("%s",a); // c
cout<<a; // cpp
return 0;
Input : working
Output : orking

那么这个呢?为什么数组在没有实际修改自身的情况下进行修改?

char a[200],*p;
gets(a); // cin.get(a,200);
p=a;
p++;
printf("%s",a); // cout<<a;
return 0;
Input : working
Output : working

在这种情况下,为什么阵列没有修改?函数strcpy有什么特殊之处?还有哪些功能具有这种适当性?

在整个文本中,我提到了程序中设置的字符串的函数。

代码段1

char a[200],*p;

定义了一个包含200个字符的块a和一个指向一个或多个字符块的指针p

gets(a); // cin.get(a,200);

将一些用户输入读取到存储块a

p=a;

在块a处指向pp现在可以用作与a相同的参考

strcpy(p,p+1);

将内存块的一部分复制到自身上。注意:这会调用未定义的行为,因为strcpy中的to和from缓冲区重叠(请参阅http://en.cppreference.com/w/cpp/string/byte/strcpy)。结果可能是不寻常的;看起来很管用"到了更神奇的地方,比如电脑让独角兽下雨。

因此,假设a是在存储器位置10处创建的。数据从位置10开始被读取到块中。然后CCD_ 10被设置为指向位置10。然后,从位置11开始的存储器被复制到从位置10开始的存储器上。由于a为10,因此打印a打印更改后的数据。由于p仍然指向10,因此打印p将打印与a相同的内容。

代码段2:

char a[200],*p;

定义了一个包含200个字符的块a和一个指向一个或多个字符块的指针p

gets(a); // cin.get(a,200);

将一些用户输入读取到存储块a

p=a;

在块a处指向pp现在可以用作与a相同的参考

p++;

移动到p指向右侧一个插槽的位置。没有复制任何内容。刚刚更改了p指向的地址。

因此,假设a是在存储器位置10处创建的。数据从位置10开始被读取到块中。然后CCD_ 26被设置为指向位置10。然后CCD_ 27被设置为指向存储器位置11。存储器块a中的值保持不变。由于a仍为10,因此打印a将打印未更改的数据。由于p现在指向11,打印p将从a的第二个字符开始打印。

您没有修改第二段代码中的任何内容。为什么要修改它?Piano指向a的第一个元素,然后递增。所以请指向第二个元素。然后打印一个未修改的。

关于第一个,来自strcpy参考:

To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source(including the terminating null character), and should not overlap in memory with source

我认为你有所谓的重叠。将源复制到内存中重叠的目标。