【问题标题】:Expression of pointers in C [duplicate]C中指针的表达[重复]
【发布时间】:2018-09-15 05:56:34
【问题描述】:

我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#define CVAL(p) (*(p++))

int main()
{

    int code[4] = {2, 100, 200};

    int nn=0;

    printf("code[0] address = %p\n", &code[0]);
    printf("nn      address = %p\n", &nn);
    printf("nn      content= %i\n\n", nn);

    int *pt = &code[0];

    nn = CVAL(pt); /*<-- line 18!*/

    printf("nn    address = %p\n", &nn);
    printf("nn    content = %i\n\n", nn);

    printf("\n");
    return 0;
}

你的输出是:

code[0] address = 0028FF2C
nn      address = 0028FF28
nn      content= 0

nn2    address = 0028FF28
nn2    content = 2

但是当我更改表达式并将其分开(第 18 行和第 19 行)时,nn2 的结果会发生变化!之前是 2,现在是 100。为什么?

...
    pt++;/*<-- line 18!*/
    nn = *pt;/*<-- line 19*/
...

输出:

code[0] address = 0028FF2C
nn      address = 0028FF28
nn      content= 0

nn2    address = 0028FF28
nn2    content = 100

【问题讨论】:

标签: c pointers macros expression


【解决方案1】:

当你有

nn = CVAL(pt); /*<-- line 18!*/

随着宏的扩展

nn = *pt++;

并且由于后缀增量使用旧值之后进行增量,它相当于

nn = *pt;
pt += 1;

这与你的第二个版本完全不同,它以相反的顺序进行取消引用和递增。

【讨论】:

    【解决方案2】:

    在第一种情况下,您的代码如下所示

    int code[4] = {2, 100, 200};
    int nn=0;
    int *pt = &code[0];
    nn = (*(pt++)); /* post increments on pointer i.e first assign then increment */
    

    在预处理器完成宏替换之后。所以这里

    nn = (*(pt++));
    

    首先解决了pt++,它是后增量,即pt仍然指向数组code的基地址,并且取消引用会将2分配给nn,因此它会打印2

    第二个场景

    pt++;/* here pt points to same address but in next statement it will points to incremented address */ 
    nn = *pt; /* here pt pointing to code[1] address */
    

    这里当nn = *pt 执行时,pt 指向code[1] 地址,因此nn 被分配给100

    通过分析以下两种情况,您可以轻松了解上面发生的情况。

    案例一:-

    int var1 = 10, var2;
    var2 = var1++; /* in this statement var2 gets assigned with 10, not incremented one as this is post increment */
    printf("%d\n",var2);
    

    案例 2:-

    int var1 = 10, var2;
    var1++;
    var2 = var1; /* now here incremented var1 gets assigned to var2 */
    printf("%d\n",var2);
    

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2011-10-01
      • 1970-01-01
      • 2011-06-25
      • 2012-06-10
      相关资源
      最近更新 更多