我写了这段代码并观察了一个有趣的行为,如果有人可以评论为什么会发生这种情况会很棒!
int main()
{
char *name = "ABCDEF";
int i = 0;
printf("\n Base address of name %u", name);
printf("\n Address ++name %u", ++name);
printf("\n Address name + 1 %u", name + 1);
printf("\n Adddress name +2 %u", name + 2);
printf("\n Base address of name %u", name);
printf("\n i %d", i);
printf("\n i+1 %d", i + 1);
printf("\n i+2 %d", i + 2);
printf("\n i+3 %d", i + 3);
printf("\n i %d", i);
return 0;
}
最后一行应返回未发生的原始指针值,也不像整数变量那样,如果指针是从前一个值发生的话,则添加的原始值为0。
答案 0 :(得分:2)
关于N1570(Emphasis mine)中的前缀增量运算符:
6.5.3.1前缀增量和减量运算符
语义
2 前缀++运算符的操作数的值递增。 结果是增量后操作数的新值。该 表达式++ E等价于(E + = 1)。
也就是说,name
在name + 1
执行后变为printf("\n Address ++name %u", ++name);
,在最后一行显示4210689
。
顺便说一句,要打印指向对象的指针的值,即该对象的地址,您应该使用printf("\n Address ++name %p", (void *)++name);
代替(但不包括指向函数的指针)。
答案 1 :(得分:1)
最后一行
printf("\n Base address of name %u",name);
打印name
的内容不打印其初始值,
在使用后增量运算符++name
之间,它会将name
的内容更改为副作用。