【发布时间】:2021-07-30 09:52:07
【问题描述】:
我有这段代码来熟悉 C:
char txt[] = "Thanksfor4lltheFish";
char *ptr = &txt[2];
printf("%c\n", ++*ptr++);
我希望将指针增加 2 并打印“k”,但我得到的“b”甚至不在这个字符串中。为什么?
【问题讨论】:
标签: c pointers pointer-arithmetic post-increment pre-increment
我有这段代码来熟悉 C:
char txt[] = "Thanksfor4lltheFish";
char *ptr = &txt[2];
printf("%c\n", ++*ptr++);
我希望将指针增加 2 并打印“k”,但我得到的“b”甚至不在这个字符串中。为什么?
【问题讨论】:
标签: c pointers pointer-arithmetic post-increment pre-increment
在这段代码sn-p之后
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
【讨论】: