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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:36:03