请解释此函数如何与指针参数一起使用

时间:2013-10-09 20:58:41

标签: c

我有一个函数,它指向int作为参数,当我第一次运行代码时,结果是:

-47 30 30

我想知道为什么,在第二次传递之后,值现在是

47 -46 -46

我似乎无法绕过它,请帮助我理解代码的流程。

 #include  <stdio.h>

 void  mystery(int *, int *, int *);

 int main(void) {
   int p = -47, *q, r = 31;
   q = &r;
   printf("%d %d %d\n", p++, *q, --r); 
   mystery(q, &r, &p);
   printf("%d %d %d\n", p, *q, r); 
   return 0;
 } /* End of main. */

 void mystery (int *x, int *y, int *z) { 
   *x = *y;
   *y = (*z)++;
   *z = 47; 
   return;
 } /* End of mystery */

4 个答案:

答案 0 :(得分:3)

mystery函数执行以下操作:

  1. 将整数x点设置为整数y指向的值。
  2. 将整数y点设置为整数z指向的值,然后然后将整数z的值递增为。< / LI>
  3. 将整数z点设置为47。
  4. 请注意,由于mystery使用后递增,因此递增从不实际执行任何操作。也就是说,y在增加z之前被指定为,而在z递增之后,它被明确地设置为47.

    现在,在main

    请注意,q是指向r的指针。这意味着当您在mystery上致电(q, &r, &p)时,会采取以下措施:

    1. 将整数q点设置为整数&r指向的值(自q == &r起无效)。
    2. 将整数&r点设置为整数&p指向的值,然后然后将整数&p的值递增为。< / LI>
    3. 将整数&p点设置为47。
    4. 至于printf函数,正如其他评论自q == &r以来所说的那样printf("%d %d %d\n", p++, *q, --r);的行为未定义。

答案 1 :(得分:1)

好吧,让我们看看会发生什么。

int p = -47, *q, r = 31;
q = &r;

现在我们有以下变量:

  • pint,包含-47
  • rint,包含31
  • qint *并指向r

现在我们做

printf("%d %d %d\n", p++, *q, --r);

p++表示打印-47并且p的值会增加,因此我们有-46*q表示我们使用q指向的值,i。即r的值。 由于r是预先递减的并且未指定参数的执行顺序,因此未精确指定此调用的结果是什么。

但我们知道,之后r的值为30

调用mystery()时,参数x被赋予参数qy获得&rz获得&p }。

现在发生了什么?

我们

*x = *y;

因此设置*q = r,一个NOP操作(q指向r)。

*y = (*z)++;

表示我们增加*z(= p),将旧值设为*y(= r)。

现在,r-46p-45

后者无关紧要,正如我们现在所做的那样

*z = 47;

再次影响p

所以神秘之后的价值是p = 47r = -46q仍然指向r,所以

printf("%d %d %d\n", p, *q, r); 

打印47 -46 -46

答案 2 :(得分:1)

堆栈上有两个整数变量pr。在mystery()函数中,xy都指向变量rz指向变量p。在行

*y = (*z)++;

r的值更改为46,并在下一行

*z = 47;

p设为47.

答案 3 :(得分:1)

初次打印后,您调用了函数

    Here p=-47 and *q=r=30  

    mystery(q, &r, &p); // made a call to function same as  mystery(&r, &r, &p);

    initializes *x=30,*y=30 and *z=-47

    //Here x and y are pointing to same reference.These consists address of `r`

    *x = *y;     // this statement makes *q=r=30
    *y = (*z)++; // this statement makes *q=r=-46 , increment -47 by 1 and assign to *y

    *z = 47; //this makes p=47

和 AS @kevin说

*qr是同一个变量,同时使用*q--r 由于sequence points之间的值更改,printf("%d %d %d\n", p++, *q, --r);是未定义的行为。