C语言数组名

C语言数组名

  • a&a的本质
  • 从二维数组角度分析
  • 从指针运算角度分析

a&a的本质

C语言数组名是一个特殊的东西

int a[5] = {1, 2, 3, 4, 5}

a &a &a[0]这三个的相等的

a是数组名,值是数组首元素的地址.数组名是一个指针常量,能用于指针运算
但是有两种情况比较特殊:

  • 使用sizeof操作符,结果为整个数组的长度
  • 使用&取地址操作时,得到一个数组指针

&a这才是一个数组指针,值是数组的地址

注意: &aa值相等,但是*&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
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×