c - C : *source++, (*source)++, *(source)++ 中的差异

标签 c pointers

这些指针之间有区别吗?每次通话到底发生了什么。

  • *p++
  • (*p)++,
  • *(p)++
  • 最佳答案

    1和3是一样的。

    请记住 ++ 的后缀和一元形式。和 --有一个结果和一个副作用:

  • x++ 的结果是 x 的当前值- 作为副作用,x递增 1(如果 x 是指针,则递增以指向序列中的下一个对象);
  • ++x 的结果是 x 的当前值加 1 - 作为副作用,x加 1(如果 x 是指针,则结果是序列中下一个对象的地址,x 更新为指向序列中的下一个对象);
  • -- 的两种形式以相同的方式工作,除了值减 1 - 如果它是一个指针,那么它被设置为指向序列中的前一个对象。

    当您将指针取消引用放入混合中时,您会得到以下结果:
  • 表达式 *p++被解析为 *(p++) (*(p)++ 也是如此)。 *p++ 的结果是 *p 的当前值(事物的值 p 当前指向)。作为副作用,p递增以指向序列中相同类型的下一个对象(IOW,数组的下一个元素);
  • 表达式 (*p)++被解析为书面。 (*p)++ 的结果是 *p 的当前值.作为副作用,*p加 1。也就是说,被指向的东西的值被更新,而不是指针。
  • 表达式 ++*p被解析为 ++(*p) . ++*p 的结果是 *p 的当前值加 1. 作为副作用,*p加 1。
  • 表达式 *++p被解析为 *(++p) . *++p 的结果是对象 p 之后的对象的值目前指向。作为副作用,p递增以指向下一个对象。

  • 假设以下声明:
    int a[] = {1, 2, 3, 4};
    int *p = a;   
    

    在这些行之后,p 的值是 &a[0] .所以,给定表达式
    x = *p++;
    
    *p++ 的结果是 1 (事物的值 p 当前指向),它被分配给 x .副作用是 p更新为指向 a[1] .

    然后我们执行
    x = (*p)++;  
    
    (*p)++ 的结果是事物的值(value)p当前指向(如果 p 指向 a[1] ,则值为 2 ),它被分配给 x .作为副作用,事情p指向增加(如果 p 指向 a[1] ,那么 a[1] 的值现在是 3 )。

    我们执行
    x = ++*p;    
    
    ++*p 的结果是事物的值(value)p指向加 1,结果是 p指向增加(如果 p 指向 a[1] ,则 a[1] + 1 的值是 4 ,它被分配给 x ,而 a[1] 的值现在是 4 )。

    最后,我们执行
    x = *++p;
    
    *++p 的结果是 p 的对象后面的对象的值当前指向和p递增以指向该对象(如果 p 指向 a[1] ,则 a[2] ( 3 )的值被写入 x ,并且 p 被更新为指向 a[2] ) .

    再次,--以同样的方式工作,只是在另一个方向。

    关于c - C : *source++, (*source)++, *(source)++ 中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55031546/

    相关文章:

    c++ - 用数组或指针引用函数?

    c - 传递指针作为参数,内存使用情况

    c - 如何遍历多路树

    c - 我无法消除矩阵,错误在哪里?

    无法增加取消引用的指针的值

    c、求指针数组的长度

    c++ - 为什么有不同类型的指针?

    c - 如何在Linux中使用C语言使用 "write"系统调用?

    c - scanf() 中的缓冲区溢出

    c - 无法评估表达式。 Malloc 失败