1

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

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

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

const char [] 的处理方式与非常量不同吗?

4

4 回答 4

11

将 *ptr 的声明切换为。

const char* ptr;

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

于 2008-11-02T21:20:54.553 回答
10

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

祝你好运!

德鲁

于 2008-11-02T21:38:29.900 回答
0

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

于 2013-10-16T17:18:34.613 回答
0

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

ptr++方法:

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

++ptr方法:

++ptr;
return *ptr;

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

于 2014-02-04T16:59:15.863 回答