char * против const char * в качестве параметра - PullRequest
36 голосов
/ 05 июля 2010

Я часто получаю ошибки компиляции, когда использую char* вместо const char*. Итак, я не уверен в реальной разнице, синтаксисе и механизме компиляции.

Ответы [ 4 ]

48 голосов
/ 05 июля 2010

Если вы после разницы между ними, просто подумайте о них как:

  • char * - это указатель, который указывает на местоположение, содержащее значение типасимвол, который также можно изменить.Значение указателя можно изменить, т. Е. Указатель можно изменить, чтобы он указывал на разные местоположения.
  • const char * - указатель, значение которого также можно изменить, который указывает на местоположениесодержит значение типа char, которое не может быть изменено.
24 голосов
/ 05 июля 2010

const char * означает «указатель на неизменяемый символ». Обычно используется для строк символов, которые не должны быть изменены.

Скажем, вы пишете эту функцию:

int checkForMatch(const char * pstr)

Вы обещали (через сигнатуру функции), что не изменит вещь, на которую указывает pstr. Теперь допустим, что часть проверки на совпадение будет включать игнорирование регистра букв, и вы попытались сделать это, преобразовав строку в верхний регистр, прежде чем выполнять другие проверки:

strupr(pstr);

Вы получите сообщение о том, что не можете этого сделать, потому что strupr объявлено как:

char * strupr(char* str);

... и это означает, что он хочет иметь возможность записи в строку. Вы не можете писать символы в const char * (для этого const).

В общем, вы можете передать char * во что-то, что ожидает const char * без явного приведения, потому что это безопасно (дать что-то изменяемое для чего-то, что не намеревается его изменить), но не может передать const char * во что-то, ожидающее char * (без явного приведения), потому что это небезопасно (передача чего-то, что не предназначено для преобразования в нечто, что может изменить его).

Конечно, это C, и вы можете делать практически все в C, включая явное приведение const char * к char * & mdash; но это было бы действительно действительно плохой идеей , потому что есть (предположительно) какая-то причина, по которой указатель, на который указывает указатель, const.

1 голос
/ 05 июля 2010

Наверное, я слишком придирчив.В моей книге символы, на которые указывает const char *, могут быть изменены, но не через const char *.Константа char * может указывать на модифицируемое хранилище.Пример:

char a[] = "abracadabra";
const char * ccp = &a[0]; // ccp points to modifiable storage.
*&a[0] = 'o'; // This writes to a location pointed to by const char* ccp

Итак, моя формулировка:

Char * - это указатель, который нужно изменить, и который также позволяет писать через него при разыменовании через * или [].

const char * - это указатель, который нужно изменить, и который не позволяет писать через него при разыменовании через * или [].

0 голосов
/ 21 апреля 2015

Я всегда пытаюсь определить параметры с const char*, а не char*, потому что преобразование из std::string в conts char* легко с помощью метода .c_str().Однако преобразование std::string в char* не так просто.

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