2008-11-02 148 views
1

C错误讯息。我有一个const char ARR []我试图遍历参数,与指针为const char []

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

我得到一个错误:分配丢弃了指针目标类型的限定

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

回答

11

将* ptr的声明切换为。

const char* ptr; 

问题是你基本上是分配一个const char * char *。这是违反常量,因为你从一个const到一个非const。

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. 

有人(我认为斯科特·迈尔斯)说,你应该阅读内而外的指针声明,即:

const char* const ptr; 

...会被读成“PTR是一个常量指针到一个不变的角色“。

祝你好运!

Drew

+0

谢谢,这很有帮助。现在我只需要记住方法标记为常量时的含义...... – 2009-03-22 21:02:18

0

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

0

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

ptr++表示:

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

++ptr表示:

++ptr; 
return *ptr; 

对于基本类型,编译器将应用这种优化的,但在C++对象将不进行遍历时,那么你应该在得到用正确的方式写它的习惯。