用指针确定输出

时间:2016-11-08 04:48:22

标签: c pointers

我需要帮助理解下面代码的一些输出。 (这只是一个期中考试的问题,而不是作业)。

 #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。

3 个答案:

答案 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)

  1. bc未按照您的说法更改
  2. 来自a
  3. main已在*a = 222
  4. 处更改
  5. 棘手的部分:a = d;表示a现在指向dmain()变量的位置。以下*a = c10放入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
}