Много раз я получаю ошибки компиляции, когда я использую char*
вместо const char*
. Итак, я не уверен в фактической разнице, синтаксисе и компиляторе.
Char * vs const char * в качестве параметра
Ответ 1
Если вы после разницы между ними, просто подумайте о них как:
- char * - это указатель, указывающий на местоположение, содержащее значение типа char, которое также можно изменить. Значение указателя может быть изменено, то есть указатель может быть изменен, чтобы указывать на разные местоположения.
- const char * - это указатель, значение которого также может быть изменено, что указывает на местоположение, содержащее значение типа char, которое не может быть изменено.
Ответ 2
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 *
— но это будет действительно действительно плохая идея, потому что есть (предположительно) какая-то причина, что указатель на указатель имеет const
.
Ответ 3
Наверное, я слишком придирчив. В моей книге символ (и), на которые указывает const char *, может быть изменен, но не через const char *. A const 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
Итак, моя формулировка:
A char * - это указатель, который должен быть изменен, а также позволяет записывать его, когда разыменовывается через * или [].
A const char * - это указатель, который должен быть изменен и который не позволяет писать через него при разыменовании через * или [].
Ответ 4
Я всегда пытаюсь определить параметры с помощью const char*
not char*
, потому что преобразование из std::string
в conts char*
легко с помощью метода .c_str()
. Однако преобразование std::string
в char*
не так просто.