指针和const char []的C错误

时间:2008-11-02 21:19:08

标签: c pointers

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

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

我收到错误:赋值从指针目标类型

中丢弃限定符

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

4 个答案:

答案 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 ++对象时不会这样做,因此您应该养成以正确的方式编写它的习惯。