C++中指针的混淆

Confusion on pointers in C++

本文关键字:指针 C++      更新时间:2023-10-16

我在练习指针时遇到了这个问题
以下代码给出了答案:

 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中的变量重命名为papbpc。所以,你在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

因此,abc是指向事物的指针,而abc是"事物"。当您将func中的变量重命名为其他变量时,会变得更容易,例如:papbpc为"pointer-to-a"。然后您可以看到您正在交换指针,并且*pa=0正在"将pa指向的值设置为0

记住这一点,修改代码会以不同的方式交换指针,从而导致不同的结果。

当我用*c改变*a时,答案是相同的

你为什么期望有什么不同?你在上面写了c=a;

随着*b=0的变化,答案是12 0

事实上,您在它之前编写了b=c;,所以在*b中编写0将清空第三个参数的内容。