我有下面的代码来熟悉C:
char txt[] = "Thanksfor4lltheFish";
char *ptr = &txt[2];
printf("%c\n", ++*ptr++);
我希望指针增加2并打印"k“,但得到的结果是"b”,它甚至不在这个字符串中。为什么?
发布于 2021-05-08 09:23:12
在此代码片段之后
char txt[] = "Thanksfor4lltheFish";
char *ptr = &txt[2];
指针ptr
指向数组文本的第三个字符,即字符'a'
。
此表达式
++*ptr++
在逻辑上等同于以下语句序列
char *tmp = ptr;
++ptr;
char c = *tmp;
++c;
结果,指针ptr
所指向的字符'a'
递增,得到字符'b'
。
带有后增量运算符的表达式的值
ptr++
是指针ptr
在递增之前的值。也就是说,你得到了字符'a‘的地址。然后,这个带有字符'a'
地址的临时表达式被取消引用
*ptr++
然后,您将获得字符'a'
本身,该字符将被递增
++*ptr++
也就是说,第一个后增量运算符被应用于指针ptr
。在取消引用由第一个后增量运算符返回的值之后,将第二个前增量运算符应用于指向的字符'a'
。
如果想要得到预期的结果,可以在printf
调用中使用以下表达式
*( ptr += 2 )
在C++中(但不是在C中),您还可以编写
*++++ptr
https://stackoverflow.com/questions/67445945
复制