【问题标题】:What's the definition of ++p where p is const char *p in C?++p 的定义是什么,其中 p 是 C 中的 const char *p?
【发布时间】:2015-10-08 14:17:57
【问题描述】:

如果我需要在 C 中迭代一个数组,我可以这样做:

void uselessTest(const char *p)
{
    while(*p)
    {
        ++p;
    }
}

我想知道这意味着什么:

  • 它是否在每个循环中测试if (*p != null)
  • 如果是p = p + 1,那是什么意思? p 是数值吗? *p 应该是指向的值,p 应该是指针的地址?那么在这个循环中p 发生变化而*p 保持不变?

【问题讨论】:

  • 这似乎不会遍历任何 array,而是更具体地说是遍历一个以零结尾的 C 字符串。 (在函数的末尾,它指向最后一个字符之后的字符。)
  • C 中的术语与某些术语有些混淆。例如,术语“null”可以有两种含义,或者作为空 指针 或作为终止字符串的空 * 字符。对于您的循环条件,测试的不是空指针而是空字符。
  • 谷歌“指针算法”。
  • 关于p++ 表达式,搜索并阅读指针算法

标签: c pointers


【解决方案1】:

是否在每个循环中测试 if (*p != null) ?

我想说更正确的是它检查*p!=0

如果 p = p + 1,那是什么意思? p是数值吗?

appears C 标准没有定义内部指针是什么。但在下面的例子中,我假设 p 持有一个表示为整数的地址(通常是这种情况)。在这种情况下,在上面的示例中,当您向其中添加一个时,p 将移动到下一个 地址,例如,如果 p 为 0x1000,则在递增后它将变为 0x1001(这是因为 char 的大小为 1,如果 p 是指向 int 的指针,它将向前移动四个字节* - 给定整数的大小是四)。

所以在这个循环中 p 改变了而 *p 保持不变?

不,确实*p 试图取消引用p,换句话说,获取存储在地址p 的对象的内容。所以当然如果你改变p的值,你也可能在新地址得到不同的内容。例如,如果p 的初始值为 0x1000,则递增后将为 0x1001,*p 将尝试读取 0x1001 处的值,这可能与存储在 0x1000 处的值不同。

* 查找指针算法以获取更多详细信息

【讨论】:

    【解决方案2】:

    它是否在每个循环中测试if (*p != null)

    如果您的意思是 0 或 '\0',是的。

    如果是p = p + 1,那是什么意思? p 是数值吗? *p 应该是指向的值,p 应该是指针的地址?那么在这个循环中 p 改变而 *p 保持不变?

    它将指针前进到下一个有意义的位置,因此根据指针算法。是的,它包含一个数字,表示指向对象的地址。确切地;此外,您不能更改指向的值 (*p),因为它是 const

    【讨论】:

    • 不,这不是“短路”评估,这就是逻辑 AND 和 OR 运算符发生的情况。执行*p*p != 0简写
    • @JoachimPileborg 是的,搞糊涂了。感谢您指出。
    • "是的,它 (p) 包含一个数字" 嗯,怀疑你会在 C 规范中找到它。它当然不需要是算术类型的数字。
    • @chux 我同意。只是为了简单。
    【解决方案3】:

    while(*p) 这会读取p 指向的字节/字符并将读取的值与0 进行比较。即检查*p 是否等于0。

    ++p; 这与p = p + 1; 相同,这增加了p 以指向下一个字符。

    实际上,由于p 指向一个字符数组,循环会帮助您遍历所有字符,直到找到一个空字符。如果p 是一个指向字符串的指针,它会遍历字符串中的所有字符。 null char (\0) 是字符串结束的地方。

    | h |电子| l | l | ○ | 0 |

    假设字符串“hello”,而p指向h,循环迭代5次(对于h、e、l、l、o),看到0就出来了。

    【讨论】:

      【解决方案4】:

      “是否在每个循环中测试 if (*p != null) ?”

      正确

      p 是一个包含“char 类型地址”的指针。地址是一个字节偏移量(从 0 开始的偏移量)。

      p + 1 将递增以指向内存中的下一个字符地址。由于 char 是一个字节长 p 将其字节偏移量增加一。 (例如,在 int32 的情况下,它将增加 4)。 如果 p 最初是 30,对于 char,p+1 将是 31,对于 int32 指针将是 34。

      在这个循环中,p 发生了变化。由于*p是p指向的内存地址所包含的值,所以它也会发生变化(一般情况下,可能是随机保持不变)。

      【讨论】:

        【解决方案5】:

        这确实是基本的 C 指针用法。

        const char *p 表示指向const char 的指针中的p => p 可以修改但*p 不能修改

        while (*p) *根据定义与while (*p != 0) 相同,所以是的,循环在每次迭代时都对*p == 0 进行测试

        ++p 增加指针,因此根据我的第一句话是合法的

        结论:这段代码循环遍历一个 char 数组,直到指向的值为 null - C 字符串结尾的 定义(以 null 结尾的 char 数组)

        【讨论】:

          【解决方案6】:

          是否在每个循环中测试 if (*p != null) ?

          C 中没有 null。有一个 NUL 终止符 ('\0') 和 NULL。后者与指针相关联。

          支票是

          if (*p != 0)
          

          相同
          if (*p != '\0')
          

          如果是 p = p + 1,那是什么意思?

          它将指针sizeof(*p) 向前移动字节。

          p是数值吗?

          p 是一个const char*,或者换句话说,一个指向char 的指针。

          *p 应该是指向的值,p 应该是指针的地址?

          *p是指针p指向的数据,p是指针指向的地址(与p的地址不同)

          【讨论】:

          • ASCII 中有NUL。在 C 中,有 null 字符 '\0'.
          【解决方案7】:

          它在每次迭代时测试 *p != null),如果为 null,则终止循环。

          它增加了指针,ergo,指针指向下一个地址。因此,使用这样的循环,您可以遍历数组中的项目。

          所以这个循环基本上是做什么的:它遍历数组中的字符,直到它到达终止\0 字符。在每次迭代中,指针p 都会增加以指向下一个字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-11-17
            • 2011-03-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多