请考虑以下代码:
void increment(int* a)
{
printf("%d\n",a);
*a=*a+1;
}
int main()
{
int a=10;
int* p=&a;
increment(&a);
printf("%d",a);
return 0;
}
这会将a增加为11但是:
void increment(int* a)
{
printf("%d\n",a);
*a++;
}
int main()
{
int a=10;
int* p=&a;
increment(&a);
printf("%d",a);
return 0;
}
上面的代码生成的值为10。
指针算术不是像整数算术那样,还是我在这里遗漏了什么?
答案 0 :(得分:3)
您缺少运营商优先级。 (*a)++;
与*a++
完全不同。
第一个在地址a
处递增值,在递增后的第二个递增a
并在原始地址处获取值。
答案 1 :(得分:0)
语句printf("%d\n",a);
不会打印a
指向的整数的值。如上所述,它会调用未定义的行为。
printf("%p\n", (void*)a);
将打印指针的值,即整数变量的地址。
printf("%d\n", *a);
将打印整数的值。
此外,*a=*a+1;
与*a++;
不同。由于运算符优先级规则,*a++
被解析为*(a++)
,指针递增,而不是指向的值。您可以使用++*a;
作为*a = *a + 1;
的简写,也可以使用其他变体:++a[0]
,a[0]++
,(*a)++
,但首选解决方案是:
*a += 1;