84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
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] 三者是等价的