gpt4 book ai didi

c++ - 指向字符串的指针在函数中如何工作?

转载 作者:行者123 更新时间:2023-11-30 21:36:39 24 4
gpt4 key购买 nike

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

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有什么特别之处?还有哪些其他函数具有这种特性?

Throughout the text, I have referred to the functions of the strings set in the program.

最佳答案

代码片段 1

char a[200],*p;

定义了一个 200 个字符的 block ,a,以及一个指向一个或多个字符的 block 的指针,p

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

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

p=a;

p指向 block ap 现在可以用作对与 a

相同的事物的引用
strcpy(p,p+1);

将部分内存块复制到自身之上。注意:这会调用未定义的行为,因为 strcpy 中的往返缓冲区重叠(请参阅 http://en.cppreference.com/w/cpp/string/byte/strcpy )。结果可能不寻常,范围从“看起来好像有效!”到更奇妙的,比如计算机让 unicorn 下雨。

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

代码片段 2:

char a[200],*p;

定义了一个 200 个字符的 block ,a,以及一个指向一个或多个字符的 block 的指针,p

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

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

p=a;

p指向 block ap 现在可以用作对与 a

相同的事物的引用
p++;

移动到了p指向右侧一个槽位的位置。什么也没复制。只是更改了 p 指向的地址。

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

关于c++ - 指向字符串的指针在函数中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47025296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com