如何理解指针数组的地址?

How to understand address for array of pointers?

我有一个简单的程序:

int main(){
    int *p[2];

    p[0] = new int;
    p[1] = new int;
    *p[0] = 10;
    *p[1] = 12;

    delete p[0];
    delete p[1];
}

编译:

g++ test.cpp -g -fno-stack-protector -o test

使用GDB调试(变量破坏前中断):

(gdb) x p
0x7fffffffdfc0: 0x5556aed0
(gdb) x &p
0x7fffffffdfc0: 0x5556aed0
(gdb) x p+1
0x7fffffffdfc8: 0x5556aef0
(gdb) x &p+1
0x7fffffffdfd0: 0xffffe0d0

所以我的问题是:

  1. 为什么p&p一样?我觉得p是数组的起始地址,即&p[0],而&p存放的是地址的阵列。我以为他们没有任何关系。
  2. 那么p等于&p,是什么定义了+1的行为,为什么p+1&p[1],而&p+1int *p[2].
  3. 之后的下一个地址

当数组类型的标识符出现在除sizeofaddress-of&)以外的表达式中或引用的初始化中时,它被转换为pointer 到第一个数组元素。因此,p 表示 &p[0].

对于 int *p[2] 表达式 &p 的类型是 int* (*)[2] 指向数组的指针 int.

p+1 移动到下一个数组元素(等价于 &p[0] + 1),增量为 sizeof(int*)

&p+1 移动到下一个数组。增量为 sizeof(p)2 * sizeof(int*).