C++ 指针:`*(&array`) 与 `array` 和 `&array` 相同

M a*_*a D 2 c++ pointers

在 C++ 中,不带括号的数组名称是指向数组第一个元素的指针。但是,我无法意识到以下代码是如何工作的

int main()
{
    int x[] = {1, 2, 3, 4};
    cout << "x = " << x << endl;    
    cout << "&x = " << &x << endl;
    cout << "*(&x) = " << *(&x) << endl;
    cout << "*x = " << *x << endl;
    cout << "**(&x) = " << **(&x) << endl;
}
Run Code Online (Sandbox Code Playgroud)

这是输出

x = 0x7ffd179e9060
&x = 0x7ffd179e9060
*(&x) = 0x7ffd179e9060
*x = 1
**(&x) = 1
Run Code Online (Sandbox Code Playgroud)

我不明白的是

  1. 为什么x = &x = 0x7ffd179e9060
  2. 如果x = &x = 0x7ffd179e9060,则必须是*x = *(&x)while*x=1*(&x) = 0x7ffd179e9060
  3. 为什么指向指针的指针**(&x) = 1在这里起作用?

提前致谢。

问题为什么 和&array指向array同一个地址?不是我问题的答案。

Chr*_*odd 6

在 C++ 中,不带括号的数组名称是指向数组第一个元素的指针

看起来可能是这样,但事实并非如此。数组名就是数组的名称,表示数组。实际发生的情况是,每当您在右值上下文中使用数组类型表达式时,它都会隐式转换为指向数组第一个元素的指针。

由于大多数上下文都是右值上下文,因此数组看起来总是与指向第一个元素的指针相同,但细节有时很重要。特别是,一元的操作数&不是右值上下文,因此当您说&x您获得指向整个数组的指针时。因此x&x最终看起来具有相同的值,并且指针的实际位模式是相同的;唯一不同的是类型。