数组名和数组名取地址的区别

来源:互联网 发布:淘宝怎么提高销量排名 编辑:程序博客网 时间:2024/05/23 11:57

这篇为转载哈:原文地址http://blog.sina.com.cn/s/blog_7e40ef210101474l.html
#include <stdio.h>
int main()
{
int a[5];
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", a + 1);
printf("%d\n", &a + 1);
printf("%d\n", &a[0] + 1);
printf("---------------\n");
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));

return 0;
}

运行结果:
编译环境为vs2013

分析:
    由运行结果可知,数组名a和&a得内存地址相同。我们由数组和指针的关系知道,a代表这个数字,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的。所以有a+1为1245040,即数组中a[1]的地址是1245040(在首地址1245036基础上加int的字节数4得到的)。
    然而,&a代表的不是取a这个变量的地址,而是取数组元素的地址。虽然&a和a得内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度(这里是4*5=20),所以&a+1得内存地址为1245056。

   其实,a的类型是int[5]   数组
         &a的类型是int(*)[5]  指针——指向int[5]数组的指针
         &a[0]的类型是int*    指针——指向int类型的指针
另外,当用sizeof时,由于它是个关键词,而不是个函数,所以数组不自动转换为指针,得到的结果是数组的长度*数组中元素类型所占的字节数,本例中sizeof(a)和sizeof(&a)都是20.

ps:如果是(int)a +1,则结果是1245037(即1245036+1)
此处我还想说明的是在答应字符串的时候有如下两种形式:
1.char a[6] = "12345"; //说明:自动在末尾加入了‘\0'作为字符串结束符
2.char a[6] = {'A','B','C','D','E','\0'};//不加\0答应会出现乱码,或则可以在之前通过memset(a,0,6)清理数组空间


0 0
原创粉丝点击