0

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

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 相同吗?

谢谢!-尔本

4

3 回答 3

6

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

于 2013-11-02T19:58:14.367 回答
2

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

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

        +-------------------------------+  
        |+-----+-----+-----+-----+-----+|  
        ||     |     |     |     |     ||  
 &b---->||  0  |  1  |  2  | ... |  N  ||  
        ||     |     |     |     |     ||  
        |+-----+-----+-----+-----+-----+|  
        +---^---------------------------+  
            |                              
            b                              
于 2013-11-02T20:06:29.933 回答
-1

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

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

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

于 2013-11-02T20:20:44.370 回答