указатель на константу, указывающий на нормальную переменную

0
char var = 'a';
const char *ptr;
ptr = &var;
*ptr = 'b'; //(i understand this is wrong)
var = 'b'; // (why is this wrong)

Я не могу изменить значение "var". означает ли это, что я изменил объявление "var" от char до const char, назначив его этому указателю (указатель на константу). Поэтому не должно быть правила, что указатель на константу должен иметь только адрес постоянных переменных. Заранее спасибо.

  • 2
    var = 'b'; Это хорошо
Теги:
pointers
c++11

2 ответа

4

Я не могу изменить значение "var".

Да, ты можешь. Вы делаете это в финальном выражении, var = 'b';

означает ли это, что я изменил объявление "var" от char до const char

var is, всегда был и всегда будет изменчивым char.

Поэтому не должно быть правила, что указатель на константу должен иметь только адрес постоянных переменных.

Нет. Единственное, что связано с указателем на константу, это то, что вы не можете изменить объект с указателем на этот конкретный указатель. Полностью можно изменить объект каким-то другим способом, поскольку вы демонстрируете себя, если сам объект изменен.


Вот еще один способ понять, что происходит:

  1. Существует объект, который является изменяемым char.
  2. Когда вы вычисляете выражение id-выражения var, вы получаете модифицируемое значение lvalue типа char которое обозначает этот объект. Вкратце, вы можете сказать, что "у объекта есть имя" var ".
  3. Когда вы оцениваете выражение *ptr, вы получаете (неизменяемый) lvalue типа const char который также обозначает тот же объект, о котором мы упоминали в (1).

В целом существует много способов обозначить один и тот же объект, то есть есть много способов ссылаться на объект как на значение какого-либо выражения. Иногда эти значения изменяемы, а иногда они неизменяемы. (Только если сам объект const, что ему не разрешено изменять его с помощью изменяемого значения, но обычно довольно сложно получить изменяемое значение, которое обозначает постоянный объект - вам понадобится нечто вроде const_cast или отбрасывающий классификатор в C.)

1

Нет ничего плохого в этой строке:

var = 'b'; // (why is this wrong)

Ваш компилятор жаловался на это? Мой не сделал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню