C++中指针的混淆
Confusion on pointers in C++
我在练习指针时遇到了这个问题
以下代码给出了答案:
1
0
3
当我用*c改变*a时,答案是一样的,但当用*b=0改变时,答案就是
1
2
0
你能告诉我每一个过程背后都发生了什么吗?
#include<iostream>
using namespace std;
void func(int *a, int *b,int *c)
{
a=b;
b=c;
c=a;
*a=0;
}
int main()
{
int a=1,b=2,c=3;
func(&a,&b,&c);
cout<<a<<endl<<b<<endl<<c;
}
a = 1
b = 2
c = 3
为了便于阅读,我将把func
中的变量重命名为pa
、pb
和pc
。所以,你在func
中混合的东西是:
pa
指向pb
所指向的内容(b
(pb
指向pc
所指向的内容(c
(pc
指向pa
所指向的(现在是b
(
因此
*pa = 0
跟随pa
的指针(指向b
(并将其设置为0,得到:
a = 1
b = 0
c = 3
然而
*pb = 0
而是跟随pb
的指针(指向c
(,并将其设置为0,从而得到:
a = 1
b = 2
c = 0
您首先要交换指针;唯一相关的线路是:
a=b;
因此,func
中的变量a
现在指向main中b
的地址。
然后
*a=0;
将func
中指向的变量a
的值(现在在您的main中是b
(设置为0
。
因此,a
、b
、c
是指向事物的指针,而a
、b
、c
是"事物"。当您将func
中的变量重命名为其他变量时,会变得更容易,例如:pa
、pb
和pc
为"pointer-to-a"。然后您可以看到您正在交换指针,并且*pa=0
正在"将pa
指向的值设置为0
记住这一点,修改代码会以不同的方式交换指针,从而导致不同的结果。
当我用*c改变*a时,答案是相同的
你为什么期望有什么不同?你在上面写了c=a;
。
随着*b=0的变化,答案是12 0
事实上,您在它之前编写了b=c;
,所以在*b
中编写0
将清空第三个参数的内容。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错