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