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

