数组名a和&a的区别
1、a表示&a[0],也即对数组首元素取地址,a+1表示首地址+sizeof(元素类型)。
2、&a虽然值为数组首元素地址,但类型为:类型 (*)[数组元素个数],所以&a+1大小为:首地址+sizeof(a)。
&a取得是整个数组的地址!既数组名取地址等价于对数组取地址。
在学习c语言的过程中我们可以发现一个一维数组的的数组名往往具有两层含义:
*作为数组名代表整个数组
*作为指针代表数组的首元素地址(因此很容易把数组和指针混为一谈)。
当数组名作为首元素的地址时:
- int main()
- {
- int arr[5];
- int*p = arr;
- printf("arr=%d\n",arr);
- printf("arr+1=%d\n",arr+1);
- printf("arr+2=%d\n",arr+2);
- printf("p=%d\n",p);
- printf("p+1=%d\n",p+1);
- printf("p+2=%d\n",p+2);
- system("pause");
- }
我们可以发现数组名等价于一个指向数组首地址的指针。
当数组名代表整个数组的时候是在以下两种情况:1.在用sizeof关键字求数组所占的内存大小。2.对数组名取地址时代表整个数组的首地址。
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int arr[5];
- int*p = arr;
- printf("arr=%d\n",arr);
- printf("arr+1=%d\n",arr+1);
- printf("&arr=%d\n",&arr);
- printf("&arr+1%d\n",&arr+1);
- printf("sizeof(arr)=%d\n",sizeof(arr));
- printf("sizeof(&arr)=%d\n",sizeof(&arr));
- system("pause");
- }
由此可见:当用sizeof求数组的内存长度时,数组名所代表的是整个数组,所以长度=5*4=20;
在用sizeof求&arr的内存长度时,他所求的空间长度是指向整个数组的地址的占用空间长度;
当对数组名取地址时&arr+1所占的地址与&arr所占的地址相差20;而arr+1所占的地址与arr所占的地址相差4;