C语言数组名
a
和&a
的本质
- 从二维数组角度分析
- 从指针运算角度分析
a
和&a
的本质
C语言数组名是一个特殊的东西
int a[5] = {1, 2, 3, 4, 5}
a &a &a[0]
这三个的值是相等的
a是数组名,值是数组首元素的地址.数组名是一个指针常量,能用于指针运算
但是有两种情况比较特殊:
- 使用sizeof操作符,结果为整个数组的长度
- 使用&取地址操作时,得到一个数组指针
&a这才是一个数组指针,值是数组的地址
注意: &a
和a
的值相等,但是*&a
和*a
的值不相等.说明*&a
是对这个数组指针进行了取值操作,取得的是数组首元素的地址,还是一个指针,而不是对&a
的值所代表的内存地址进行取值.这应该是C语言对数组指针运算的特殊规定.*a
就不言而喻是数组首元素的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <stdio.h> int main(int argc, const char * argv[]) { int a[5]={1,2,3,4,5}; printf("a = %x\n",a); //数组名 值相等而已 printf("&a = %x\n",&a); //数组地址 printf("sizeof a = %d\n", sizeof(a)); //数组长度 printf("*(int*)&a = %x\n",(*((int *)(&a)))); //取得数组第一个元素的值 printf("*&a = %x\n", *(&a)); // 还是一个指针,值为数组首元素的地址 printf("**&a = %x\n",(*(*(&a)))); //数组第一个元素的值 printf("&a[0] = %x\n",&a[0]); //数组第一个元素的地址 printf("*&a[0] = %x\n",*(&a[0])); //数组第一个元素的值 printf("*a = %x", *a); //数组第一哥元素的值 return 0; }
|
结果:
1 2 3 4 5 6 7 8 9
| a = 5fbff780 &a = 5fbff780 sizeof a = 20 *(int*)&a = 1 *&a = 5fbff780 **&a = 1 &a[0] = 5fbff780 *&a[0] = 1 *a = 1
|