C 指针的地址是如何寻址的?

C 指针的地址是如何寻址的?,c,pointers,C,Pointers,我遇到了一个关于指针的C语言测试,但我不知道我的答案是对还是错。 下面给出了代码并找出了结果。 顺便说一下,变量a、p、q、r的地址被看作500600700800 int main(void) { int a = 10, *p = &a, **q = &p, ***r = &q; printf("%u %u %u %u %u", &a, p, q, r, *r); return 0; } 我以为p指向a的地址,q指向

我遇到了一个关于指针的C语言测试,但我不知道我的答案是对还是错。 下面给出了代码并找出了结果。 顺便说一下,变量
a、p、q、r的地址被看作
500600700800

int main(void)
{
   int  a = 10, *p = &a, **q = &p, ***r = &q;
   printf("%u %u %u %u %u", &a, p, q, r, *r);
  
   return 0;
}
我以为p指向a的地址,q指向p的地址,r指向q的地址。因此,
&a
等于
p
q
等于
*r

因此,我假设结果是
500700600

int main(void)
{
   int  a = 10, *p = &a, **q = &p, ***r = &q;
   printf("%u %u %u %u %u", &a, p, q, r, *r);
  
   return 0;
}

这是正确的答案吗?

如果p持有a的地址,那么p=500,q持有p的地址,所以q=600,r持有q的地址,所以r=700,和*r=600。,那么最后的ans是500600700600。这意味着你的假设是绝对正确的。

如果p持有a的地址,那么p=500,q持有p的地址,所以q=600,r代表q的地址,所以r=700,*r=600。所以最后的ans是500500600700600。这意味着你的假设是绝对正确的。

谢谢你的回复。还有一件事,如果我要
printf(“%u%u%u%u%u”,&a+1,p+1,q+1,r+1,*r+1)
那么我是否必须向每个地址添加
4
,因为一个地址需要4字节的内存?结果可能会是
504 504 604 704 604
?@Learner_15,但它会调用未定义的行为,因此结果不会被忽略certain@klutt隐马尔可夫模型。。所以我想,从初学者的角度来看,我只是在研究指针,这应该是测验所要寻找的正确答案。指针算法考虑了对象的大小,因此它取决于当前机器上的
int
的大小。你为什么不试试printf(“%p%p”,&a,&a+1)
自己看看呢?你的答案是对的。应该是504604704604。谢谢你的回复。还有一件事,如果我要
printf(“%u%u%u%u%u”,&a+1,p+1,q+1,r+1,*r+1)
那么我是否必须向每个地址添加
4
,因为一个地址需要4字节的内存?结果可能会是
504 504 604 704 604
?@Learner_15,但它会调用未定义的行为,因此结果不会被忽略certain@klutt隐马尔可夫模型。。所以我想,从初学者的角度来看,我只是在研究指针,这应该是测验所要寻找的正确答案。指针算法考虑了对象的大小,因此它取决于当前机器上的
int
的大小。你为什么不试试
printf(“%p%p”,&a,&a+1)
自己看看呢?你的ans是对的。它应该是50460504604。你不应该用
%u
来打印指针。相反,请使用
%p
。打开编译器警告不应使用
%u
打印指针。相反,请使用
%p
。打开编译器警告