为什么`&array`和`array`指向同一个地址?

jin*_*wan 51 c++ arrays pointers

到现在为止,我认为数组与指针相同.但我发现了一个奇怪的案例:

int array[5] = { 10,11,12,13,14};

std::cout << array << std::endl;
std::cout << &array << std::endl;
std::cout << &array[0] << std::endl;

int *pArray = new int[5];

std::cout << pArray << std::endl;
std::cout << &pArray << std::endl;
std::cout << &pArray[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)

产量

0x7ffeed730ad0
0x7ffeed730ad0
0x7ffeed730ad0

0x7f906d400340
0x7ffeed730a30
0x7f906d400340
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,array并且&array具有相同的价值.但是pArray并且&pArray有不同的价值.如果数组与指针相同,则数组的地址应与数组不同.怎么可能array&array是一样的?如果array&array相同,保存数组值的内存的地址是什么?

Som*_*ude 83

普通array衰变到指向其第一个元素的指针,它等于&array[0].第一个元素也恰好与数组本身在同一地址开始.因此&array == &array[0].

但重要的是要注意类型是不同的:

  • 类型&array[0]是(在您的示例中)int*.
  • 类型&arrayint(*)[5].

之间的关系&array[0]&array,如果我表现出来更多一点"图形"可能会更容易(与指针加):

+----------+----------+----------+----------+----------+
| array[0] | array[1] | array[2] | array[3] | array[4] |
+----------+----------+----------+----------+----------+
^
|
&array[0]
|
&array

虽然指针有所不同.指针array指向某个内存,值array是该内存的位置.这是你使用时得到的&array[0].它也是一样的pArray.

当你使用时,pArray你得到一个指针指针.也就是说,您获得变量pArray本身的位置(地址).它的类型是&pArray[0].

指针有点图形,&pArray就像这样

+--------+       +-----------+-----------+-----------+-----------+-----------+-----+
| pArray | ----> | pArray[0] | pArray[1] | pArray[2] | pArray[3] | pArray[4] | ... |
+--------+       +-----------+-----------+-----------+-----------+-----------+-----+
^                ^
|                |
&pArray          &pArray[0]

[注意pArray在"数组"的末尾,这是因为指针不保留它指向的内存的信息.指针仅指向特定位置,即"数组"的"第一个"元素.将内存视为"数组"取决于程序员.]