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

为何C++中int **a = &(&val);语句会触发编译错误?

为什么&(&val)会触发编译错误?

核心原因:一元&运算符要求操作数是左值

编译错误提示的lvalue required as unary '&' operand,意思是一元&(取地址)运算符的操作数必须是左值,而&val的结果是一个右值,不符合要求。

  • 左值:是实际占据内存空间、可以被取地址的对象,比如你定义的val、p这类变量都是左值——它们有自己的存储位置,能被修改、能被取地址。
  • 右值:是临时的、没有固定内存位置的数值,比如字面量10,或者&val这种表达式计算出的临时结果——&val返回的是val的内存地址,但这个地址只是一个临时的数值,并没有被存在一个固定的内存位置里,所以没法对它再取地址,就像你不能写&10一样。

正确写法的逻辑

在第二个例子里:

int val = 10;
int *p = &val;  
int **a = &p;   
  • p是一个左值变量,它专门用来存储val的地址,占据了一块内存空间。
  • 对p取地址&p,本质是获取这个存储指针的变量的内存地址,结果类型是int**,完全符合a的类型要求。

总结

要得到指向指针的指针,必须先把第一个指针的结果存在一个左值变量中,再对这个变量取地址。直接对&val的结果取地址是行不通的,因为&val返回的是右值,没有可被取地址的内存空间。

内容的提问来源于stack exchange,提问作者akhil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:02:05