【问题标题】:Incrementing pointer on string results in pointer to char not on string在字符串上增加指针会导致指向 char 的指针不在字符串上
【发布时间】: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


【解决方案1】:

在这段代码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

【讨论】:

  • @AndreasWenzel 非常感谢。我好像恢复了你的更新。
  • @poorlydisguised 一点也不。不客气。:)
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多