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