C++
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr;
我知道 p
是一个指向包含 5 个元素的数组的指针,但是当我尝试打印地址时:
cout << p << " " << *p << " " << &arr << endl;
它给了我:
0x7fff50c91930 0x7fff50c91930 0x7fff50c91930
问题:
p
怎么会等于 *p
?现在 p
等于 &arr
,为什么 *p != arr[0]
? p
和 *p
的值到底是什么?
想象一下p
指向5个int的整 block 内存
会更清楚。所以如果有 ( p + 1 )
它将指向下一个内存块。
这有助于回答您的问题。
How could p equals *p?
p
是指向数组 [5] 的指针,它被初始化为指向 arr[5]
*p
是第一个数组元素的值 - 即 arr[5]
的地址。并且因为数组的名称是第一个元素的地址。因此,当您打印 p
和 *p
时,它们是相同的。
And now that p equals to &arr, why *p != arr[0]?
*p
是第一个数组元素的地址 - 这意味着整个 arr[5]
内存块的地址。另一方面,arr[0]
是 p
指向的数组的第一个元素,因此它是一个真实值 (1)不是地址。
What exactly does the value p and *p hold?
作为你的第一个问题,它们都保存了整个arr[5]
内存块的地址。