C中指针的表达[重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

我有以下代码:

#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
2个回答
0
投票

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

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

通过分析以下两个场景,您可以轻松了解上面发生的事情。

情况1 :-

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);

1
投票

当你有

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

随着宏扩大了

nn = *pt++;

并且由于后缀增量在使用旧值后执行增量,因此它等效于

nn = *pt;
pt += 1;

这与您的第二个版本完全不同,后者以相反的顺序执行取消引用和增量。

© www.soinside.com 2019 - 2024. All rights reserved.