数组地址与数组首字节地址之间的关系

欧大琛 2018-10-23 PM 3471℃ 0条

定义一个数组

int a[5] = {0};
  • 此处a的类型看似为整个数组,实际上该数组名a为一个常量指针,也就是数组第一个元素a[0]的地址,同理a+1为第二个元素a[1]的地址。在上例中,数组名的类型就是指向int类型的常量指针,该值不可修改。
  • BUT! BUT! BUT!在数组名作为sizeof操作符或者单目操作符&的操作数时数组名a不作为常量指针,对数组名&a实际得到的是数组的首地址,其值在数值上与a&a[0]相同,但含义不同,&a+1实际已经增加了整个数组的长度。
#include<stdio.h>
int main(int argc, char *argv[])
{
        int a[5] = {0};

        printf("a     = %p\n", a);
        printf("a + 1 = %p\n", a + 1);
        printf("&a    = %p\n", &a);   
        printf("&a + 1= %p\n", &a + 1);
        printf("&a[0] = %p\n", &a[0]);
        printf("a[0]  = 0x%x\n", a[0]);
        printf("sizeof(a) = %d\n", sizeof(a));
        printf("sizeof(&a) = %d\n", sizeof(&a));
}

结果:

a      = 0xbf840eac //首元素地址
a + 1  = 0xbf840eb0
&a     = 0xbf840eac //数组首地址
&a + 1 = 0xbf840ec0 //(&a+1) - (a) = 0x14 = 20 = 5*sizeof(int)
&a[0]  = 0xbf840eac //取首元素地址
a[0]   = 0x0
sizeof(a) = 20
sizeof(&a) = 4

参考文献:人民邮电出版社 《C和指针》 Kenneth A.Reek著 徐波译 第八章 8.1 一维数组

标签: none

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

欧大琛

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成赞赏

非特殊说明,本博所有文章均为博主原创。

评论啦~