【问题标题】:C error with pointer and const char[]指针和 const char[] 的 C 错误
【发布时间】:2023-03-03 20:57:01
【问题描述】:

我有一个要迭代的 const char arr[] 参数,

char *ptr;
for (ptr= arr; *ptr!= '\0'; ptr++) 
  /* some code*/

我得到一个错误:赋值丢弃了来自指针目标类型的限定符

const char [] 的处理方式是否与非 const 不同?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    将 *ptr 的声明切换为。

    const char* ptr;
    

    问题是您实际上是在将 const char* 分配给 char*。这是对 const 的违反,因为您要从 const 变为非 const。

    【讨论】:

      【解决方案2】:

      正如 JaredPar 所说,将 ptr 的声明更改为

      const char* ptr;
      

      它应该可以工作。尽管看起来令人惊讶(您如何迭代 const 指针?),但您实际上是在说指向的字符是 const,而不是指针本身。事实上,有两个不同的地方可以在指针声明中应用 const(和/或 volatile),这 4 种排列中的每一种都有略微不同的含义。以下是选项:

      char* ptr;              // Both pointer & pointed-to value are non-const
      const char* ptr;        // Pointed-to value is const, pointer is non-const 
      char* const ptr;        // Pointed-to value is non-const, pointer is const
      const char* const ptr;  // Both pointer & pointed-to value are const.
      

      有人(我认为是 Scott Meyers)说你应该从里到外阅读指针声明,即:

      const char* const ptr;
      

      ...将被读作“ptr 是一个指向常量字符的常量指针”。

      祝你好运!

      画了

      【讨论】:

      • 谢谢,这很有帮助。现在我只需要记住当方法被标记为 const 时是什么意思...
      【解决方案3】:

      const 声明抓住左边的任何东西。如果没有,它看起来是正确的。

      【讨论】:

        【解决方案4】:

        对于像上面这样你不关心返回值的交互循环,你应该说++ptr而不是ptr++

        ptr++ 表示:

        temp = *ptr;
        ++ptr;
        return temp;`
        

        ++ptr 表示:

        ++ptr;
        return *ptr;
        

        对于原始类型,编译器将应用此优化,但在迭代 C++ 对象时不会应用,因此您应该养成以正确方式编写它的习惯。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-12
          • 2016-06-10
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          • 2021-02-28
          相关资源
          最近更新 更多