以下两个程序使用一些基本的指针操作。但他们表现不同。
#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);
}
此程序打印相同的字符串两次,而它也必须打印不同的字符串。
为什么会出现这种差异?
gets()如何读取字符串?
答案 0 :(得分:3)
第二个示例只包含一个字符串缓冲区,即数组s
。
将ptr
指向s
不会以任何方式创建字符数据的第二个副本,因此当您同时打印ptr
和s
时,会产生结果在同一个字符串中,因为它们评估的地址完全相同。
答案 1 :(得分:1)
代码运行后:
ptr = s;
ptr
指向s
的开头,所以当你调用printf()
时,你会得到两次相同的地址 - 难怪同样的地址被打印两次。
答案 2 :(得分:1)
在第二个示例中,您只有一个数组(s
)以及指向同一内存的第二个指针。这两个地址ptr
和s
是相同的,因此当然在printf()
中使用相同的输出会产生相同的结果。在第一个示例中,您有两个不同的整数,可以包含不同的值。
答案 3 :(得分:1)
因为这两个字符指针仍然指向同一个内存。您只是将数据分配给指向的内存。
但是在整数指针的情况下,你改变了第一个指针指向的内存地址。
如果你喜欢这样:
pb = &a;
pc = pb;
*pb = 7;
两种情况下都会打印7张。这就是你用字符指针做的。
图片说明:
当你做了pb =&amp; a; pb将指向a。的内存地址。
当你做pc = pb; pb&amp; pc将指向a。的内存地址。
当你做了pb =&amp; b; pb将指向b的内存地址。但是pc仍然会指向a。的内存地址。
免责声明:我附上图片的答案,SO中存在一些技术问题。这就是3张图像没有显示的原因。查看https://meta.stackexchange.com/questions/186466/intermittent-error-with-imgur-when-uploading-images
答案 4 :(得分:0)
此程序打印相同的字符串两次,而且还必须打印不同的字符串。
绝对不能。在第一个示例中,指针指向不同的对象。在第二个中,显式指针和一个s
衰减到指向内存中的相同数组(显然......)