c / c ++指向数组的指针vs指向指针的指针

我认为数组和指针基本上是一回事,直到我运行这个程序:

int main() { int* a = new int(19); int b[1]; b[0] = 19; printf("*a: %d\na: %p\n &a:%p\n", *a, a, &a); printf("*b: %d\nb: %p\n &b:%p\n", *b, b, &b); delete a; } 

输出是:

 *a: 19 a: 0x7f94524000e0 &a:0x7fff51b71ab8 *b: 19 b: 0x7fff51b71ab4 &b:0x7fff51b71ab4 

有人可以解释为什么&b的输出与b相同?

谢谢! -Erben

数组和指针不一样。 指针可以表现得像一个数组(例如通过索引访问)。

&b是指向整个数组的指针, b是指向第一个元素的指针。 它们可能指向内存中的相同地址,但它们完全不同。

  +-------------------------------+ |+-----+-----+-----+-----+-----+| || | | | | || &b---->|| 0 | 1 | 2 | ... | N || || | | | | || |+-----+-----+-----+-----+-----+| +---^---------------------------+ | b 

好吧, b是一个数组。 在最轻微的借口下,它会衰变为指向b的第一个元素的指针。 但是请注意,表达式b&b 等价: b衰变为指针的第一个元素,即它的类型为int*&b是指向数组的指针,即它的类型为int(*)[1]

a是变量。 您正在使用new分配内存并将结果分配给此指针。 您可能决定在稍后的程序中存储其他内容。

b是不同的。 它不是一个变量,因为它不能存储不同的地址。 这是一个arrays,具有固定的起始位置。

因此, b&b是相同的。 但是a的内容和a的实际地址是不同的。