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

时间:2013-11-02 19:54:42

标签: c++ c arrays pointers

我认为数组和指针基本相同,直到我运行这个程序:

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

3 个答案:

答案 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的实际地址不同。