带数组的postincrement指针

时间:2014-06-18 18:29:59

标签: c pointers

无法理解为什么a [1]的值不等于10

void main()
{
    int a[]={2,1};
    int *ptr=a;
    *ptr++=10; //trying to update a[1]=10
    printf("%d",*ptr);
} 

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:5)

让我们来看看你的代码吧:

int main() {
    int a[]={2,1};
    int *ptr=a;

    // Validation 
    assert(ptr == &a[0]);

    // Let's now do what *ptr++ = 10 actually does:
    *ptr = 10;
    ptr = ptr + 1;

    // Validation
    assert(ptr == &a[1]);

    // Printing. Note that we are printing a[1], not a[0].
    printf("%d",*ptr);
} 

cppreference阅读引用可能也会有所帮助。他们正在讨论后缀增量(ptr++)和前缀增量(++ptr)之间的区别。

  

运算符的 postfix 版本的返回结果是原始操作数,副作用是在返回此结果后操作数递增/递减。

     

运算符的前缀版本的返回结果是递增/递减的操作数。

听起来你想要使用前缀增量,而不是后缀增量。

答案 1 :(得分:3)

由于++的优先级高于一元*,因此*p++将被归为*(p++),这意味着:取消引用旧的ptr并增加{ {1}} ptr(只要使用原始值,增量就可以随时发生)。 1会将*ptr++=10;更新为a[0]

答案 2 :(得分:0)

您的代码被注释为执行流程:

int main(void)
{
    int a[]={2,1}; //sets a[0]=2, a[1]=1
    int *ptr=a;    //sets *ptr == address of a, or a[0]
    *ptr++=10;     //sets a[0] = 10  (a[1] unchanged)
    printf("%d",*ptr);
    getchar();
}  

*ptr++=10;将值10分配给[0]的地址,然后在分配后增加* ptr