关于C语言指针的问题。。

#include

int val[100];

int main(void)
{
for (int i = 0; i < 100; ++i)
val[i] = i;
int *p1 = &val[10], *p2 = &val[20];
printf("%d\n", *p2 - *p1);
printf("%d\n",p2-p1);
return 0;
}

为什么*p2-*p1的值和p2-p1的值一样,p2是p2指针的地址,*p2是指针所指向
地址存储的值,结果怎么会相同呢?

6个回答

我测试过了,的确是1,我打印了地址,实际上确实差4个字节的, 看最后两个结果。
可能答案的1表示的是一个int*这么多的字节,
楼楼有答案了记得叫我啊图片图片

指针是有类型的,当两个指针做减法时,它们表示的是这两个指针之间可以存储其指向类型数据的个数。
而在你的代码中恰好这两个值是一样的,你可以在赋值时改为val[i]=i*2;但是p2-p1是不会变的。

你的代码中恰好这两个值是一样的
*p2 - *p1 正好是 val[20] -val[10],而你val[i]=i,所以一直等于10
p2-p1表示从p1到p2有几个元素,正好是10个元素,所以说巧了

p2-p1得到的不是地址上的距离,而是之间元素的个数

图片说明 推荐c++ primer plus

指针相减是指这个指针都指向同一个数组时,结果是这两个指针在内存中的距离,(单位是元素长度),也就是元素个数,按照你的程序来说是10;而前面的结果是val[20]-val[10]=20-10=10。结果相同但是,这是两个不同的概念。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问