如果a是数组(例如int a [4];),那么&a是什么?

Say*_*iss 0 c arrays pointers reference

可能重复:
C:数组的地址如何等于它的值?

我在GCC 4.4.1中测试,我发现&a=a.我无法理解.我认为&a应该是存储数组地址的地址,它不能相同.有人能给我一个很好的解释吗?非常感谢.

Ada*_*eld 8

数组是内存中的对象.它有一个地址和大小.在某些上下文中,数组也会衰减为指向其第一个元素的指针.所以数值,如果同时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)

  • 但是,它们的类型不同 - "a"是"指向int的指针",而"&a"是"指向四个整数的指针".所以`a + 1`和`(&a)+ 1`将在数字上__ifferent_地址. (2认同)