Ошибка C с указателем и const char [] - PullRequest
1 голос
/ 03 ноября 2008

У меня есть параметр const char arr [], который я пытаюсь перебрать,

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

Я получаю сообщение об ошибке: назначение отбрасывает квалификаторы из целевого типа указателя

Обрабатывается ли const char [] иначе, чем не-const?

Ответы [ 4 ]

11 голосов
/ 03 ноября 2008

Переключить объявление * ptr на.

const char* ptr;

Проблема в том, что вы, по сути, назначаете const char * для char *. Это нарушение const, так как вы переходите от const к неконстантному.

10 голосов
/ 03 ноября 2008

Как сказал JaredPar, измените объявление ptr на

const char* ptr;

И это должно работать. Хотя это выглядит удивительно (как вы можете выполнить итерацию константного указателя?), Вы на самом деле говорите, что указательный символ - это констант, а не сам указатель. Фактически, есть два разных места, где вы можете применять 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 голосов
/ 04 февраля 2014

Для целочисленных циклов, подобных описанным выше, когда вас не волнует возвращаемое значение, вы должны сказать ++ptr вместо ptr++.

ptr++ означает:

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

++ptr означает:

++ptr;
return *ptr;

Для примитивных типов компилятор будет применять эту оптимизацию, но не будет, когда перебирает объекты C ++, поэтому вы должны привыкнуть писать это правильно.

0 голосов
/ 16 октября 2013

Объявление const захватывает все, что находится слева. Если ничего нет, все выглядит правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...