所以我是新手,并用指针测试了一些东西,我对以下printf有一个疑问:
char txt[] = "thisIsAQuestion";
char *ptr = &txt[9];
printf("%cn", ++(*ptr));
printf("%cn", *ptr);
因此,遵循我的"知识",它会这样做:
指针指向值" e"。然后,如果我执行第一个printf,则执行的第一件事是在((中的命令,因此指针 *ptr的解释,因为它比前缀增量具有更高的优先级。现在,我认为 的作用将像(*ptr 1(,因为指针已经被删除了,并增加了指针指向的价值,但不会更改指针本身。所以这将是" f"。
但是现在,当我运行第二个printf时,它表明指针仍然指向" f",而没有"返回"到'e'。
我的想法有错误吗?还是我没有考虑过的其他东西?
您错过了零件,指针指向地址前缀++
操作员更改操作数的值。
将像(*ptr 1(
一样
不,它的作用类似于*ptr = (*ptr + 1)
。
so,(*ptr)
导致e
的值(如预期(,然后通过应用++
,该值会增加并存储到相同的存储位置中。
-
前缀增量运算符的结果是新值,该值将作为参数传递给
printf()
-它打印该值。 -
对于第二个
printf()
语句,您已经打印了增量值。
相关,引用C11
,第6.5.3.1章
前缀
++
运算符的操作数的值是增加的。结果是增量后操作数的新值。表达式++E
等于(E+=1)
。[...]
char *ptr = &txt[9];
指向txt
,但从e
角色开始。
printf("%cn", ++(*ptr));
首先增加e
字符并将其打印为f
(e
1
= f
(
和printf("%cn", *ptr);
语句只需打印一个字符,其中指向(及其f
(,因为e
值随++(*ptr)
更改。