Страницы

Поиск по вопросам

пятница, 7 декабря 2018 г.

Присваивание символа const char *

Добрый день, хочу расставить точки над «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";

Комментариев нет:

Отправить комментарий