我对此代码有疑问。答案是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;
}
答案 0 :(得分:4)
在您的ypntr = fun(xpntr);
行之前,x=8
和xpntr
指向x
。
现在是棘手的部分:ypntr = fun(xpntr)
将x
的值更改为13。fun
返回对x
的引用-ypntr
现在指向到x
。
这意味着xptr
和yptr
都指向相同的数据。
您的最后一条语句(*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
调用xpntr
,xpntr
指向的对象发生了一些变化,但是正如我们已经了解的那样,xpntr本身在此过程中没有改变。 fun
返回的值(仅为xpntr
)已分配给ypntr
。 x将再次更改为8 + 5 = 13
ypntr = fun(xpntr);
将ypntr
指向的位置分配给xpntr
和xpntr
所指向的值之和(现在与ypntr
相同。因此x将是13 + 13 = 26 ←这就是您26岁的来源!
*ypntr = *xpntr + *ypntr;
打印xpntr
和ypntr
指向的位置的值。
cout << x << " " << y << " " << *xpntr << " " << *ypntr << endl;
}