C语言中指针的表示

C语言中指针的表示,c,pointers,macros,expression,C,Pointers,Macros,Expression,我有以下代码: #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);

我有以下代码:

#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;
}
但是,当我改变表达式并将其分隔为第18行和第19行时,nn2的结果会改变!2之前,现在是100。为什么?

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

nn = CVAL(pt); /*<-- line 18!*/
由于后缀增量在使用旧值后进行增量,因此它相当于

nn = *pt;
pt += 1;

这与您的第二个版本大不相同,后者以相反的顺序执行解引用和增量操作。

在第一个场景中,您的代码如下所示

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++是post增量,即pt仍然指向数组代码的基址,解引用将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指向代码[1]地址,因此nn被分配100

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

案例1:

案例2:-

int*pt=&代码[0];与int*pt=code;相同;。看见
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++;/* 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 */
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);
int var1 = 10, var2;
var1++;
var2 = var1; /* now here incremented var1 gets assigned to var2 */
printf("%d\n",var2);