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
|
二维数组
在二维数组中,数组名a
是第一个一维数组的数组指针
理解完下面这段代码,就能轻松使用指针运算来获取二维数组的值了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <stdio.h> int main(int argc, const char * argv[]) { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int i = 0; int j = 0; printf("a = %x \n", a); //第一个一维数组的数组指针 printf("*a = %x \n", *a); //第一个一维数组的首地址 printf("**a = %d \n", **a); //第一个一维数组中第一个元素的值 printf("(a+1) = %x \n", (a+1)); //第二个一维数组的数组指针 printf("*(a+1) = %x \n", *(a+1)); //第二个一维数组的首地址 for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("%d\n", *(*(a+i) + j)); //通过指针运算获取值 } } return 0; }
|