这两个指针如何具有相同的值?

时间:2019-01-28 19:37:46

标签: c++ pointers

我对此代码有疑问。答案是26 14 2626。

问题是,我一直发现x为13。在第一个有趣的函数x和xptr变为13之后,但我不知道它如何变为26。

#include <iostream>
using namespace std;
int* fun(int *a){
    *a = *a +5;
    return a;
}
int main(){
    int x, y, *xpntr, *ypntr;
    x = 3;
    xpntr = &x;
    fun(xpntr);
    y = 10 + (*xpntr / 2);
    ypntr = fun(xpntr);
    *ypntr = *xpntr + *ypntr;
    cout << x << " " << y << " " << *xpntr << " " << *ypntr << endl;
}

2 个答案:

答案 0 :(得分:4)

在您的ypntr = fun(xpntr);行之前,x=8xpntr指向x

现在是棘手的部分:ypntr = fun(xpntr)x的值更改为13。fun返回对x的引用-ypntr现在指向到x

这意味着xptryptr都指向相同的数据。

您的最后一条语句(*ypntr = *xpntr + *ypntr)只是将x的值加倍。

+---------------------------+----+----+------+------+
|           code            | x  | y  | xptr | yptr |
+---------------------------+----+----+------+------+
| x = 3;                    |  3 | ?  | ?    | ?    |
| xpntr = &x;               |  3 | ?  | &x   | ?    |
| fun(xpntr);               |  8 | ?  | &x   | ?    |
| y = 10 + (*xpntr / 2);    |  8 | 14 | &x   | ?    |
| ypntr = fun(xpntr);       | 13 | 14 | &x   | &x   |
| *ypntr = *xpntr + *ypntr; | 26 | 14 | &x   | &x   |
+---------------------------+----+----+------+------+

答案 1 :(得分:3)

让我们逐步检查您的代码

#include <iostream>
using namespace std;
int* fun(int *a){

下一行表示:“从指针a所指向的位置获取值,将其加5,然后将其写入指针a所指向的位置。 这不会更改指针本身!

    *a = *a +5;

接下来返回指针a,该指针与传递给函数的值相同

    return a;
}

int main(){
    int x, y, *xpntr, *ypntr;
    x = 3;

xpntr的存储位置分配给x

    xpntr = &x;

fun调用xpntr,丢弃返回的内容。则x将为3 + 5 = 8

    fun(xpntr);

将10 +(y指向的 / 2)的值分配给xpntr – xpntr不会改变。 y = 10 +(8/2)= 14

    y = 10 + (*xpntr / 2);

fun调用xpntrxpntr指向的对象发生了一些变化,但是正如我们已经了解的那样,xpntr本身在此过程中没有改变。 fun返回的值(仅为xpntr)已分配给ypntr。 x将再次更改为8 + 5 = 13

    ypntr = fun(xpntr);

ypntr指向的位置分配给xpntrxpntr所指向的值之和(现在与ypntr相同。因此x将是13 + 13 = 26 ←这就是您26岁的来源!

    *ypntr = *xpntr + *ypntr;

打印xpntrypntr指向的位置的值。

    cout << x << " " << y << " " << *xpntr << " " << *ypntr << endl;
}