You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数组名与&array地址一致疑问:*(&x)与x表现差异解析

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;
}

运行输出:

x = 0x7ffd179e9060
&x = 0x7ffd179e9060
*(&x) = 0x7ffd179e9060
*x = 1
**(&x) = 1

问题1:为何x与&x的地址值相同?

数组名x在多数语境下会隐式转换为指向数组首元素的指针,类型是int*,指向的是数组第一个元素x[0]的地址。
&x是整个数组的地址,类型是int(*)[4](指向包含4个int的数组的指针)。
数组的首元素地址和整个数组的起始地址本来就是同一个位置——数组从首元素开始存放,所以两者的地址数值完全相同,但类型截然不同,这是核心区别。

问题2:为何x等于1,而(&x)却等于数组地址?

  • *x:x被转换为int*类型指针,指向首元素x[0],解引用后得到首元素的值1。
  • *(&x):&x是int(*)[4]类型指针,解引用它得到整个数组本身。而数组名在输出时会再次隐式转换为指向首元素的指针,所以最终打印的还是数组首元素的地址值。
    简单说,*(&x)等价于数组名x,输出结果自然和x一致。

问题3:为何**(&x)结果为1,能正常运行?

&x是int(*)[4]类型指针,第一次解引用*(&x)得到整个数组,数组随即隐式转换为int*类型的首元素指针;第二次解引用*就是对这个首元素指针解引用,最终得到首元素的值1。
拆解逻辑:
**(&x) = *(*(&x)) = *(x) = x[0] = 1
这看起来是二级指针操作,但本质是两次不同类型的解引用,并非真正的二级指针用法。


内容的提问来源于stack exchange,提问作者M a m a D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:05:11