这些指针之间是否有区别?每个呼叫在这里到底发生了什么。
答案 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
的值。在这种情况下,它将为0
。 i
的值将作为副作用增加。请参阅草稿中的报价
n1570-§6.5.2.4/ 2:
后缀++运算符的结果是操作数的值。副作用是,操作数对象的值增加了(即,向其添加了适当类型的值1)。有关约束,类型和转换以及操作对指针的影响的信息,请参见加法运算符和复合赋值的讨论。 结果的值计算先于更新操作数存储值的副作用进行排序。
对于*source++
,编译器会将其解析为*(source++)
。表达式source++
的结果是source
的值。因此,将取消引用当前指针(在副作用之前指向地址source
的指针,然后对source
进行副作用。
(*source)++
将首先取消引用指针,然后将取消引用的值增加1。
*(source)++
等同于第一种情况。
我为错误的答案表示歉意,并给罢工留下了错误的答案,以便将来的读者在有人得出与我相同的错误结论时上课。感谢@interjay和@pmg纠正了我。我真的很高兴你们能加入这个社区,并以敏锐的眼睛和头脑为这个社区做出贡献。