|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
int main()
{
int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p)[10] = &array;
printf("%d\n", *(*(p+1)-6));
return 0;
}
我去试着打印了地址,发现p+1和*(p+1)地址是一样的,但是(p+1)-2和(*(p+1)-2)打印的地址完全不一样,第一个的减法每一次都减了10*4也就是40个,但是第二个,是先用*(p+1)拿到array[10]的地址,再减去8个字节,就拿到了array[8]的地址,这时候再用*号就可以拿到值了
这里面最不理解的就是为啥要用*取一次地址,然后再用*取一次,才能够拿到值,不是*就可以直接取指针的值吗
你的疑问很好!让我们来解释一下。
在你的代码中,变量 "p" 是一个指向整型数组 "array" 的指针。当我们使用 "p+1" 时,实际上是将指针 "p" 向后移动了一个整型的大小,也就是4个字节(如果你的机器上一个整型占用4个字节的话)。所以,"p+1" 的结果就是指向了数组 "array" 中下一个元素的地址。
当你使用 "*(p+1)" 时,你实际上是获取了指针 "p+1" 指向的地址中存储的值。这个地址就是数组 "array" 的第二个元素的地址。由于数组的元素类型是整型,所以通过 "*(p+1)" 就可以获取到这个整型值。
所以,为什么我们需要用两个 "*" 来获取数组中的元素值呢?这是因为 "*(p+1)" 返回的是一个指向整型的指针,而不是实际的整型值。如果我们想要获取指针指向的那个整型值,就需要再使用一个 "*" 运算符来间接地访问这个值。
所以,在你的代码中,"*(*(p+1)-2)" 的作用是先将指针 "p+1" 指向的地址减去2个整型的大小(即8个字节),然后再获取这个地址中存储的整型值。
希望这个解释能够帮助你理解指针和指针运算的概念!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|