为何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
相关产品推荐
相关产品推荐

