Добрый день, хочу расставить точки над «i» для себя.
const char *v = "123d";
const char *c = "123";
c[2] = '5'; // Так нельзя
c = v;
c = "asdfas";
Вопрос в следующем. Почему, когда мы const char * присваиваем строку, он присваивает, а символ — нет? Может, где-то для const char * перегружен оператор присваивания, и он ему присваивает новый адрес? А при присваивании литерала мы пытаемся записать по тому же адресу?
Ответ
Вопрос в следующем. Почему, когда мы const char * присваиваем строку, он присваивает, а символ — нет?
Нужно различать константный указатель и указатель на константу.
1) Указатель на константу: нельзя менять содержимое объекта, на который указывает указатель, но можно менять содержимое самого указателя (указатель — это переменная, содержащая адрес другой переменной).
char array[] = "string";
const char * с = array; // Указатель на объект, который нельзя менять
c[1] = 'a'; // Нельзя, т. к. меняется содержимое указываемого объекта
с = "345"; // Можно, т. к. меняется значение самого указателя
2) Константный указатель: можно менять содержимое объекта, но нельзя менять значение самого указателя. Проще говоря, указатель нельзя переназначить на другой объект, но сам указатель поменять можно.
char array[] = "string";
char * const с = array;
c[1] = 'a'; // можно
с = "345"; // нельзя
3) Константный указатель на константу: совокупность первых двух.
const char * const с = "123";
Комментариев нет:
Отправить комментарий