指针的增量是否与整数的增量相同?

时间:2016-08-03 10:00:53

标签: c pointers pointer-arithmetic

请考虑以下代码:

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。

指针算术不是像整数算术那样,还是我在这里遗漏了什么?

2 个答案:

答案 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;