Say*_*iss 0 c arrays pointers reference
可能重复:
C:数组的地址如何等于它的值?
我在GCC 4.4.1中测试,我发现&a=a.我无法理解.我认为&a应该是存储数组地址的地址,它不能相同.有人能给我一个很好的解释吗?非常感谢.
数组是内存中的对象.它有一个地址和大小.在某些上下文中,数组也会衰减为指向其第一个元素的指针.所以数值,如果同时a和&a作为指针的值进行比较,它们的比较结果为相等,因为它们都指向内存中的同一地址.但它们具有不同的数据类型:在某些上下文中a具有类型int[4]("数组4 int")或int*("指向int"),而&a总是具有类型int (*)[4]("指向数组4的指针int").
&a points here
|
V
+------+------+------+------+
| a[0] | a[1] | a[2] | a[3] | sizeof(a) == 16
+------+------+------+------+
^
|
&a[0] also points here
In certain contexts, 'a' means &a[0]
Run Code Online (Sandbox Code Playgroud)
因此,(void *)a == (void *)&a.
还要注意,因为a并且&a指向不同的数据类型(特别是指向的类型具有不同的大小),所以执行指针算法将产生不同的结果. a+1将指向&a[1](前进一个int值),而&a+1将指向刚好超过数组的末尾&a[4],因为它前进一个"数组4 int"单位:
&a+1 points here
|
V
+------+------+------+------+
| a[0] | a[1] | a[2] | a[3] |
+------+------+------+------+
^
|
a+1 points here
Run Code Online (Sandbox Code Playgroud)