-2

以下两个程序使用了一些基本的指针操作。但他们的表现不同。

#include<stdio.h>
#include<string.h>

int main(void){
     int a = 1;
     int b = 2;
     int *pb, *pc;
     pb = &a;
     pc = pb;
     pb = &b;
     printf("%d %d\n", *pb, *pc);
}

该程序按预期打印两个不同的数字(1 和 2),同时,

#include<stdio.h>
#include<string.h>

int main(void){
     char *ptr, s[10];
     ptr = s;
     gets(s);
     printf("%s %s\n", ptr, s);
}

该程序两次打印相同的字符串,而它也必须打印不同的字符串。

为什么会有这种差异?

get() 如何读取字符串?

4

5 回答 5

3

第二个示例仅包含一个字符串缓冲区,即数组s

指向不会以任何方式创建字符数据的第二个副本,因此当您同时打印ptrand时,它们会产生相同的字符串,因为它们的计算结果完全相同。sptrs

于 2013-06-28T10:23:02.473 回答
1

在您的代码运行后:

ptr = s;

ptr指向 的开头s,所以当你调用时,printf()你会得到相同的地址两次传递 - 难怪相同的地址被打印两次。

于 2013-06-28T10:23:55.107 回答
1

在您的第二个示例中,您只有一个数组 ( s) 加上一个指向同一内存的第二个指针。这两个地址ptrs是相同的,因此当然使用 then inprintf()会产生相同的输出。在您的第一个示例中,您有两个不同的整数,它们可以保存不同的值。

于 2013-06-28T10:28:43.733 回答
1

因为这两个字符指针仍然指向同一个内存。您只是将数据分配给指向的内存。

但是在那个整数指针的情况下,你改变了第一个指针指向的内存地址。

如果你这样做了:

pb  = &a;
pc  = pb;
*pb = 7;

在这两种情况下都会打印 7 。这就是你对字符指针所做的。


用图片解释:

当你做 pb = &a; pb 将指向 a 的内存地址。

pb = &a

当你做 pc = pb; pb & pc 将指向 a 的内存地址。

个人计算机 = 铅

当你做 pb = &b; pb 将指向 b 的内存地址。但是 pc 仍然会指向 a 的内存地址。

pb = &b

免责声明:我附上了带有答案的图片,SO中有一些技术问题。这就是没有显示 3 张图像的原因。检查https://meta.stackexchange.com/questions/186466/intermittent-error-with-imgur-when-uploading-images

于 2013-06-28T11:14:17.540 回答
0

该程序两次打印相同的字符串,而它也必须打印不同的字符串。

它不应该。在您的第一个示例中,指针指向不同的对象。在第二个中,显式指针和一个s衰减到指向内存中的同一个数组(显然......)

于 2013-06-28T10:23:40.460 回答