在 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)
我不明白的是
x = &x = 0x7ffd179e9060?x = &x = 0x7ffd179e9060,则必须是*x = *(&x)while*x=1且*(&x) = 0x7ffd179e9060**(&x) = 1在这里起作用?提前致谢。
问题为什么 和&array指向array同一个地址?不是我问题的答案。
在 C++ 中,不带括号的数组名称是指向数组第一个元素的指针
看起来可能是这样,但事实并非如此。数组名就是数组的名称,表示数组。实际发生的情况是,每当您在右值上下文中使用数组类型表达式时,它都会隐式转换为指向数组第一个元素的指针。
由于大多数上下文都是右值上下文,因此数组看起来总是与指向第一个元素的指针相同,但细节有时很重要。特别是,一元的操作数&不是右值上下文,因此当您说&x您获得指向整个数组的指针时。因此x和&x最终看起来具有相同的值,并且指针的实际位模式是相同的;唯一不同的是类型。