84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
int a[2]; printf("%x %x\n", a, &a); // a &a 输出一样
怎么解释这种现象
小伙看你根骨奇佳,潜力无限,来学PHP伐。
数组名,用来访问数组元素的时候,它就表示数组的首地址,而当你用它来访问数组本身的时候,它就是数组的地址。只不过数组的首地址与数组的地址相同而已。
a 表示 &a[0],a+1 表示 &a[1]……在这个层次上,数组名等效于可以访问数组内部元素的指针。
a
&a[0]
a+1
&a[1]
&a 是对数组这个『对象』取址,而 &a + 1 表示与数组 a 规模相同的另一个数组。在这个层次上,&a 等效于访问数组这个整体的指针——指向数组的指针。
&a
&a + 1
C风格数组是平铺在栈上的,其构成除了数组元素之外又没有其它成员。所以,数组首个元素和数组地址一样不很正常吗?要么怎么叫“首个”元素呢。
有一个方法可能能帮你理解执行下面的代码
int a[64]; printf("%x %x %x %x", a, a+1, &a, (&a)+1);
在我的机器上,运行结果是:29fe10 29fe14 29fe10 29ff10第一个结果和第二个结果差4,第三个结果和第四个结果差0x1004刚好是int的长度,0x100(256)刚好是一个为长64的int数组的长度
a是这个数组的首元素的地址,所以你才能用*(a+i)的方式访问第i个元素,而&a是这个数组的地址,但因为一块数据的地址是取其首字节的地址,所以他们的值相同
char A[20][20][20][20]; printf("%x %x %x %x %x ", A[0][0][0] ,A[0][0],A[0], A, &A);
这五个值的也是一模一样
如果一个变量存储自己的地址,那么对它取一万次地址,也是它自己,
以上有误。
在C语言中,当数组名作为函数参数的时候,它会被转换为指向数组第一个元素的指针,又因为数组第一个元素的地址就等于数组地址,所以这里传到printf里的a和&a参数,对应它们在函数内部的对象的值是相等的,且都等与数组的地址。
&a是数组的地址
a是数组首元素的首地址
&a + 1 已经跑到数组外面了
a + 1是数组的第二个元素的地址
a + 1
a和&a的值都是地址,这两个地址是相等的。
但是a和&a的类型不一样,具体的说:a的类型是int *&a的类型是int (*)[2]
这个类型会影响指针加减运算的结果,所以a+1和(&a)+1结果不等。在这个例子中,a+1比a多4个字节,(&a)+1比&a多8字节
在C中,数组名的值是一个指针常量,也就是数组第一个元素的地址所以&a, a, &a[0] 三者是等价的
数组名,用来访问数组元素的时候,它就表示数组的首地址,而当你用它来访问数组本身的时候,它就是数组的地址。只不过数组的首地址与数组的地址相同而已。
a
表示&a[0]
,a+1
表示&a[1]
……在这个层次上,数组名等效于可以访问数组内部元素的指针。&a
是对数组这个『对象』取址,而&a + 1
表示与数组a
规模相同的另一个数组。在这个层次上,&a
等效于访问数组这个整体的指针——指向数组的指针。C风格数组是平铺在栈上的,其构成除了数组元素之外又没有其它成员。所以,数组首个元素和数组地址一样不很正常吗?要么怎么叫“首个”元素呢。
有一个方法可能能帮你理解
执行下面的代码
在我的机器上,运行结果是:
29fe10 29fe14 29fe10 29ff10
第一个结果和第二个结果差4,第三个结果和第四个结果差0x100
4刚好是int的长度,0x100(256)刚好是一个为长64的int数组的长度
a是这个数组的首元素的地址,所以你才能用*(a+i)的方式访问第i个元素,而&a是这个数组的地址,但因为一块数据的地址是取其首字节的地址,所以他们的值相同
这五个值的也是一模一样
如果一个变量存储自己的地址,那么对它取一万次地址,也是它自己,
以上有误。
在C语言中,当数组名作为函数参数的时候,它会被转换为指向数组第一个元素的指针,又因为数组第一个元素的地址就等于数组地址,所以这里传到printf里的
a
和&a
参数,对应它们在函数内部的对象的值是相等的,且都等与数组的地址。&a
是数组的地址a
是数组首元素的首地址&a + 1
已经跑到数组外面了a + 1
是数组的第二个元素的地址a和&a的值都是地址,这两个地址是相等的。
但是a和&a的类型不一样,具体的说:
a的类型是int *
&a的类型是int (*)[2]
这个类型会影响指针加减运算的结果,所以a+1和(&a)+1结果不等。
在这个例子中,a+1比a多4个字节,(&a)+1比&a多8字节
在C中,数组名的值是一个指针常量,也就是数组第一个元素的地址
所以
&a, a, &a[0] 三者是等价的