【问题标题】:Incrementing pointers correctly?正确递增指针?
【发布时间】:2013-07-15 12:27:06
【问题描述】:

我正在使用 char* 数组将字符串的一部分复制到另一个 char* 数组中,我想知道是否这样做

do {
    *pntr1++ = *pntr2++
} while (*pntr2 != '\0');

是一样的
do
{
    *indPtr = *wordPtr;
    indPtr++;
    wordPtr++;
} while (*wordPtr != '\0');

或者我最终会跳过使用第一种方法的索引吗?

【问题讨论】:

  • 你试过了吗?发生了什么?
  • @RogerRowland 在可能出现未定义行为的情况下,在一个特定实例中依赖“发生了什么”可能是个坏主意。
  • 是的,两者都是一样的:我更喜欢while(*pntr1++ = *pntr2++);
  • @DavidBrown 你对我的问题读得太多了。一个简单的测试将显示任何固有的差异,除了在这两种情况下都没有对输入进行空检查外,没有涉及真正的“未定义行为”。

标签: c++ loops pointers increment


【解决方案1】:

是的,两者是等价的。后增量表示在该表达式中使用增量 before 的值,并且增量发生在表达式末尾的序列点之前的某个时间(或者,在 C++ 术语中,“在序列之前”下一个表达式)。

因此,在这两种情况下,赋值都使用指针之前的值,它们递增,与\0的比较使用指针之后的值> 它已经增加了。

如果您希望这会复制一个字符串,那确实会导致问题:至少在您显示的代码中,终止(假定的)字符串的 \0 不会被复制(尽管您可以添加之后的代码以终止目标字符串)。

【讨论】:

  • 是的,我刚刚遇到了这个问题,循环一直持续到数组中没有内存地址为止,因为递增语句跳过了 '\0'。有什么办法可以避免这种情况仍然会复制数组?
  • @Bbvarghe:你通常想要while ((*d++ = *s++) != '\0') {} 这样的东西,所以你复制一个字节并立即检查该字节的值,如果它是你的终止符,则跳出循环。
  • 声明*d++ = *s++如何与'\0'相提并论?
  • @Bbvarghe:赋值是产生结果(被赋值的值)的表达式。
【解决方案2】:

运算符++a++ 一样使用时,首先返回a 的值,然后将其递增。

所以,代码

*a++ = *b++

*a = *b;
a++;
b++;

是等价物。

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2010-09-23
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多