"深入理解C语言" 指针

时间:2023-07-11 23:47:08

  本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析.

#include <stdio.h>
int main(void){
int a[];
printf("%x\n", a);
printf("%x\n", a + );
printf("%x\n", &a);
printf("%x\n", &a + );
return ;
}

  假设a的地址是:0Xbfe2e100, 而且是32位机,那么这个程序会输出什么?

  #1: 第一条printf语句应该没有问题,就是 bfe2e100

  #2: 第二条printf语句你可能会以为是bfe2e101。那就错了,a+1,编译器会编译成 a+ 1*sizeof(int),int在32位下是4字节,所以是

  加4,也就是bfe2e104【a为指向int类型数据的指针】

  #3: 第三条printf语句可能是你最头疼的,我们怎么知道a的地址?我不知道吗?可不就是bfe2e100。那岂不成了a==&a啦?这怎么可

  能?自己存自己的?也许很多人会觉得指针和数组是一回事,那么你就错了。如果是 int *a,因为a是指针,所以&a是指针的地址,a和

  &a不一样。但是这是数组啊a[],所以&a其实是被编译成了&a[0]。

  #4: 第四条printf语句就很自然了,就是bfe2e104。还是不对,因为是&a是数组,被看成int(*)[5],所以sizeof(a)是5,也就是

  5*sizeof(int),也就是bfe2e114【&a可以理解为指向int [5]类型的指针,即a为数组类型】

Reference:

深入理解C语言: http://coolshell.cn/articles/5761.html