C/C++中是否可以获取int类型变量i++或++i的地址?
C/C++能否对自增表达式取址的问题解答
首先直接给出结论:你写的示例代码在C、C++中都属于不规范写法,大部分场景下会直接编译报错,不存在合法通用的直接对i++或++i取地址的方法。
核心原理:取地址符只能作用于左值
取地址运算符&的操作数必须是左值,也就是在内存中拥有固定、持久存储位置的对象;临时生成、没有固定内存地址的右值不能被取地址。
1. 后缀自增i++的规则
不管是C还是C语言,i++的返回值都是临时右值:它的执行逻辑是先拷贝一份i的原始值到临时变量,再对i本身做加1操作,最终返回这个临时拷贝值。这个临时值没有持久的内存地址,因此&(i++)在C和C中都是完全非法的,编译一定会报错。
2. 前缀自增++i的规则
C和C++对++i的返回值定义有差异:
- C语言环境:
++i的返回值同样是右值,执行加1操作后返回的是i的新值的临时拷贝,没有固定地址,因此&(++i)在C中也是非法的。 - C++语言环境:
++i的返回值是左值,执行加1操作后直接返回i本身的引用,语法上&(++i)是可以编译通过的,但这种写法可读性极差,且和C语言规则不兼容,非常不推荐使用。
正确的实现方式
如果你想要拿到自增操作后的i的地址,直接分开写自增和取地址操作即可,这种写法兼容C和C++,可读性也更高:
int i = 0; // 对应i++后取地址的需求 i++; int *p1 = &i; // 对应++i后取地址的需求 ++i; int *p2 = &i;
你给出的示例代码:
int i = 0; int *p1 = &(i++); int *p2 = &(++i);编译报错的原因总结:
- C语言:两行取址操作均非法,两种自增表达式返回的都是不可取址的右值
- C++语言:仅
&(i++)非法,&(++i)语法可过但完全不推荐使用
内容的提问来源于stack exchange,提问作者ZSY-ARCH
相关产品推荐
相关产品推荐

