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

时间:2019-03-06 20:20:02

标签: c pointers

这些指针之间是否有区别?每个呼叫在这里到底发生了什么。

  1. * p ++
  2. (* p)++,
  3. *(p)++

3 个答案:

答案 0 :(得分:1)

微小的测试程序。

#include <stdio.h>

int main(void) {
    char z[] = "World";
    char n[] = "Something";
    char *x = "Hello!!";


    while(*x) printf("%c", *x++);
    printf("\n");
    x = z;
    while(*x) printf("%c", (*x)++);
    printf("\n");
    x = n;
    while(*x) printf("%c", *(x)++);
    printf("\n");
    return 0;
}

因此*x++取消引用指针,然后递增指针 (*x)++-仅增加引用对象。 *(x)++ == *x++

IMO而不是要求自己尝试。您将学到https://ideone.com/bliza0

答案 1 :(得分:1)

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}的结果*p++(事物1当前指向的值),它被分配给p副作用x已更新为指向p

然后我们执行

a[1]

x = (*p)++; 结果(*p)++当前指向的事物的值(如果p指向p,则该值是a[1]),它被分配给2。副作用是,x指向的事物增加了(如果p指向p,则a[1]的值现在为a[1])。

我们执行

3

x = ++*p; 的结果是事物++*p指向加号1的值,结果p所指向的事物被递增(如果p指向到p,则a[1]的值为a[1] + 1,该值已分配给4,而x的值现在为a[1]

最后,我们执行

4

x = *++p; 的结果是对象{em>跟着 *++p当前指向的对象的值,p递增以指向该对象(如果p指向p,则将a[1]a[2])的值写入3,并且将x更新为指向到p)。

同样,a[2]的工作方式相同,只是方向相反。

答案 2 :(得分:0)

*source++将被解析为*(source++),因为++的{​​{3}}比*运算符高。它将使指针增加1,然后取消对指针的引用。  


首先要了解该行为,让我解释一下后增量运算符是如何工作的。

int i = 0;
int j = i++;

这意味着表达式i++的值将是操作数i的值。在这种情况下,它将为0i的值将作为副作用增加。请参阅草稿中的报价

n1570-§6.5.2.4/ 2:

  

后缀++运算符的结果是操作数的值。副作用是,操作数对象的值增加了(即,向其添加了适当类型的值1)。有关约束,类型和转换以及操作对指针的影响的信息,请参见加法运算符和复合赋值的讨论。 结果的值计算先于更新操作数存储值的副作用进行排序

对于*source++,编译器会将其解析为*(source++)。表达式source++的结果是source的值。因此,将取消引用当前指针(在副作用之前指向地址source的指针,然后对source进行副作用。

(*source)++将首先取消引用指针,然后将取消引用的值增加1。

*(source)++等同于第一种情况。


我为错误的答案表示歉意,并给罢工留下了错误的答案,以便将来的读者在有人得出与我相同的错误结论时上课。感谢@interjay和@pmg纠正了我。我真的很高兴你们能加入这个社区,并以敏锐的眼睛和头脑为这个社区做出贡献。