代码之家  ›  专栏  ›  技术社区  ›  zxcv

指针和const char[]出现C错误

  •  1
  • zxcv  · 技术社区  · 17 年前

    我有一个const char arr[]参数,我试图迭代它,

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

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

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

    4 回复  |  直到 17 年前
        1
  •  11
  •   JaredPar    17 年前

    将*ptr的声明切换为。

    const char* ptr;
    

    问题是,你本质上是将一个const char*赋值给一个char*。这违反了const,因为你要从const变为非const。

        2
  •  10
  •   Drew Hall    17 年前

    正如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是指向常量字符的常量指针”。

    祝你好运

    德鲁

        3
  •  0
  •   JimmyJohn    12 年前

    const声明获取左侧的任何内容。如果没有什么,它看起来是正确的。

        4
  •  0
  •   Kjuly    12 年前

    对于像上面这样的迭代循环,如果你不关心返回的值,你应该说 ++ptr 而不是 ptr++ .

    ptr++ 指:

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

    ++ptr 指:

    ++ptr;
    return *ptr;
    

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