我需要帮助理解下面代码的一些输出。 (这只是一个期中考试的问题,而不是作业)。
#include <stdio.h>
void figure_me_out(int* a, int b, int c, int* d);
int main(void) {
int var1 = 1, var2 = 10, var3 = 15, var4 = 20;
figure_me_out(&var1, var2, var3, &var4);
printf("%d, %d, %d, %d\n", var1, var2, var3, var4);
return 0;
}
void figure_me_out(int* a, int b, int c, int* d) {
c = b;
b = *d;
*a = 222;
*d = 100;
a = d;
*a = c;
}
输出
222, 10, 15, 10
当我查看代码时,我得到10,10,15,100。这是我的逻辑:
c = 10 ---&gt; c按值传递,因此对于printf,c不会改变
b = 20 ---&gt;与上述相同的原因
* a = 222 ---&gt;这取消引用a并给它值222.由于var a通过引用传递,它会改变原始值
* d = 100 ---&gt;与上述相同的原因
(这部分是我感到困惑的地方) a = 100 ---&gt;我认为,由于d被改为100,这意味着a被分配了d等于现在,即100 * a = 10 ---&gt;将a的值更改为10
我知道该函数没有改变b(var2)和c(var3)的原始值,因为它们是通过值传递的,但它改变了其余部分。所以我很困惑为什么var1打印为222而var4打印为10。
答案 0 :(得分:1)
我认为这很简单,让我们一步一步走:
void figure_me_out(int* a, int b, int c, int* d)
{
c = b; // c = 10
b = *d; // b = 20
*a = 222; // *a = 222 : Value at address a is changed to 222
*d = 100; // *d = 100 : Value at address d is changed to 100
a = d; // a = d: Change address of local pointer variable a to d.
*a = c; // Changing value of address a which is same as address d to 10
}
在步骤3中,您更改了从main函数传递的地址a的原始值。 在步骤5中,您将函数中的传递地址从主变量更改为局部变量 a 。在做a = d之后,具有地址的局部变量被改变为d的地址。现在,您对此地址所做的任何操作都将在 d 的地址位置生效 在步骤6中,您已将d的值更改为10.
所以最终答案是222,10,15,10
答案 1 :(得分:0)
b
和c
未按照您的说法更改a
的main
已在*a = 222
a = d;
表示a
现在指向d
中main()
变量的位置。以下*a = c
将10
放入a
指向的对象(之前为d
)。这意味着d
main()
得到10
答案 2 :(得分:0)
我希望它可以帮到你。请参阅以下C代码段:
#include <stdio.h>
void figure_me_out(int* a, int b, int c, int* d);
int main(void)
{
int var1 = 1, var2 = 10, var3 = 15, var4 = 20;
figure_me_out(&var1, var2, var3, &var4);
printf("%d, %d, %d, %d\n", var1, var2, var3, var4);
return 0;
}
void figure_me_out(int* a, int b, int c, int* d)
{
c = b; // Explanation: c is overidden by b, that means 10 so c is 10 now
b = *d; // Explanation: b is 20
*a = 222; // Explanation: var1 value modified and it is set 222 (Called by ref.)
*d = 100; // Explanation: var4 value modified and it is set 100 (Called by ref.)
a = d; // Explanation: integer pointer a stored address of the var4
*a = c; // Explanation: 10 assigned to var4 (Because c already modified in first line of the this function)
//Finally you will get: 222 10 15 10
}