我认为数组和指针基本相同,直到我运行这个程序:
int main() {
int* a = new int(19);
int b[1];
b[0] = 19;
printf("*a: %d\n a: %p\n &a:%p\n", *a, a, &a);
printf("*b: %d\n b: %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
答案 0 :(得分:6)
嗯,b
是一个数组。在最轻微的借口下,它将衰变成指向b
的第一个元素的指针。但请注意,表达式b
和&b
不等于:b
衰减为第一个元素的指针,即类型为{{ 1}}而int*
是指向数组的指针,即类型&b
。
答案 1 :(得分:2)
数组和指针不一样。指针可以表示像一样的数组(例如,通过索引访问)。
&b
是指向整个数组的指针,b
是指向第一个元素的指针。它们可能指向内存中的相同地址,但它们完全不同。
+-------------------------------+
|+-----+-----+-----+-----+-----+|
|| | | | | ||
&b---->|| 0 | 1 | 2 | ... | N ||
|| | | | | ||
|+-----+-----+-----+-----+-----+|
+---^---------------------------+
|
b
答案 2 :(得分:-1)
a
是一个变量。您正在使用new
分配内存并将结果分配给此指针。您可能决定稍后在程序中的a
中存储其他内容。
b
不同。它不是一个变量,因为它不能存储不同的地址。它是一个阵列,具有固定的起始位置。
因此,b
和&b
是相同的。但a
的内容和a
的实际地址不同。