我有一个我试图迭代的 const char arr[] 参数,
char *ptr;
for (ptr= arr; *ptr!= '\0'; ptr++)
/* some code*/
我收到一个错误:赋值从指针目标类型中丢弃限定符
const char [] 的处理方式与非常量不同吗?
将 *ptr 的声明切换为。
const char* ptr;
问题是您实际上是在将 const char* 分配给 char*。这是对 const 的违反,因为您要从 const 变为非 const。
正如 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 声明抓住左边的任何东西。如果什么都没有,它看起来是正确的。
对于像上面这样你不关心返回值的交互循环,你应该说++ptr
而不是ptr++
.
ptr++
方法:
temp = *ptr;
++ptr;
return temp;`
++ptr
方法:
++ptr;
return *ptr;
对于原始类型,编译器将应用此优化,但在迭代 C++ 对象时不会应用,因此您应该养成以正确方式编写它的习惯。