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

C++引用与指针修改规则及解引用赋值问题咨询

第一个认知验证

你的认知完全正确。
对应代码解析:

int i(3);
int& j(i); // 定义左值引用j,是i的别名,二者共享同一块内存空间
int* k(&i); // 定义指针变量k,自身拥有独立的内存空间,存储的是i的内存地址
  • 引用一旦绑定后就无法更换绑定对象,所有对j的修改本质都是直接修改i对应的内存空间,因此二者值会完全同步。
  • 仅修改指针k本身存储的地址值(也就是修改指向)时,改动的只有k自身的内容,不会影响i、j对应的内存,因此二者值不会发生变化。

第二个疑问解释

你产生混淆的核心原因是没有区分「修改指针本身的值」和「修改指针指向内存的值」这两种完全不同的操作。
你给出的代码完整补全后如下:

int a = 1, b = 2;
int *p = &a, *q = &b;
*p = *q;

解析:

  • 你认知中的「修改指针指向不影响原变量」对应的是直接修改指针本身的操作,比如执行p = &b,此时只会修改p存储的地址,让p从指向a改为指向b,这个操作确实不会修改a的值。
  • 但代码中的*p是解引用操作,含义是访问指针当前指向的内存空间,这里p指向a,因此*p等价于a;同理*q等价于b。因此*p = *q本质就是执行a = b,当然会把a的值修改为2。

两种操作的差异对比如下:

  • 修改指针本身:代码示例p = &b,效果为修改p存储的地址让p指向b,不会影响原变量a的值
  • 修改指针指向的内存:代码示例*p = 10,效果为把p指向的内存空间赋值为10,当p指向a时会直接修改a的值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:54:07