【发布时间】:2023-03-03 20:57:01
【问题描述】:
我有一个要迭代的 const char arr[] 参数,
char *ptr;
for (ptr= arr; *ptr!= '\0'; ptr++)
/* some code*/
我得到一个错误:赋值丢弃了来自指针目标类型的限定符
const char [] 的处理方式是否与非 const 不同?
【问题讨论】:
我有一个要迭代的 const char arr[] 参数,
char *ptr;
for (ptr= arr; *ptr!= '\0'; ptr++)
/* some code*/
我得到一个错误:赋值丢弃了来自指针目标类型的限定符
const char [] 的处理方式是否与非 const 不同?
【问题讨论】:
将 *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++ 对象时不会应用,因此您应该养成以正确方式编写它的习惯。
【讨论】: