Подтвердить что ты не робот

Char * vs const char * в качестве параметра

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

4b9b3361

Ответ 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* не так просто.