指向字符串的指针如何在函数中起作用?

时间:2017-10-30 22:41:22

标签: c++ c arrays pointers char

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

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 有什么特别之处?其他哪些功能有这个优点?

  

在整篇文章中,我已经提到了程序中设置的字符串的功能。

2 个答案:

答案 0 :(得分:1)

Snippet 1

char a[200],*p;

将一个包含200个字符的a块和一个指针p定义为一个或多个字符的块。

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

将一些用户输入读入内存块a

p=a;

p栏的a点数。 p现在可以用作与a

相同的参考
strcpy(p,p+1);

将部分内存块复制到自身上。注意:这会调用未定义的行为,因为strcpy中的to和from缓冲区重叠(请参阅http://en.cppreference.com/w/cpp/string/byte/strcpy)。结果可能不同寻常,范围从“看起来像它的作品!”更加精彩,比如计算机让雨水独角兽。

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

代码段2:

char a[200],*p;

将一个包含200个字符的a块和一个指针p定义为一个或多个字符的块。

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

将一些用户输入读入内存块a

p=a;

p栏的a点数。 p现在可以用作与a

相同的参考
p++;

移动p指向右侧的一个插槽。什么都没复制。刚刚更改了p指向的地址。

因此,在内存位置10创建a。数据从位置10开始读入块。然后p设置为指向位置10.然后p为设置为指向内存位置11.内存块a中的值保持不变。由于a仍为10,因此打印a会打印未更改的数据。由于p现在指向11,因此打印p将从a的第二个字符开始打印。

答案 1 :(得分:0)

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

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

{{1}}

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