Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 130
∙ повысить рейтинг »
mklokov
Статус: 6-й класс
Рейтинг: 107
∙ повысить рейтинг »
CradleA
Статус: Профессионал
Рейтинг: 98
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1922
Дата выхода:09.08.2017, 12:15
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:26 / 24
Вопросов / ответов:1 / 1

Консультация # 191251: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
int nVar = 10;
int pVar = &nVar;
const int* pcVar = pVar;   //это можно,
int* pVar2 = pcVar;      
...

Консультация # 191251:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

int nVar = 10;
int pVar = &nVar;
const int* pcVar = pVar;   //это можно,
int* pVar2 = pcVar;          //а это - нет

Встретила вышеуказанный пример, комментарии от автора примера. Не могу понять, почему нельзя.
Похоже не правильно трактую код:
1 строка: объявлена переменная nVar типа int, присвоено значение 10;
2 строка: здесь не понимаю, вроде бы объявлена переменная pVar типа int и в нее записан адрес переменной nVar... Разве в обычные переменные можно записать адрес другой переменной?
А если это указатель, а не обычная переменная, то где * ? Разве не должно быть:
int* pVar = &nVar;

3 строка: объявлен указатель pcVar на константный указатель pVar, т.е. присваивается адрес pVar;
4 строка: объявлен указатель pVar2 на указатель pсVar, т.е. присваивается адрес pсVar. Почему нельзя?
Посмотрите, пож алуйста, где я неправильно перевожу? smile

Дата отправки: 29.07.2017, 14:35
Вопрос задал: pNod (1-й класс)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Вадим Исаев ака sir Henry (Старший модератор):

Здравствуйте, pNod!
Начнём с того, что из всего списка переменных только самая первая (nVar) хранит именно какое-то значение. Этот момент существенный для понимания работы с остальными переменными.
Следующие три переменные всего лишь хранят адреса, указывающие на какой-то объект, в данном случае на переменную nVar. По крайней мере так должно быть.
С объявлением переменно №2, pVar, явная ошибка, скорее всего это опечатка. Компилятор сразу же укажет на ошибку в этой строке. Судя по тому, что ей присваивается адрес nVar объявление должно быть таким:

int * pVar = &nVar;

Третья переменная pcVar объявлена как константа, неизменяемая, потому что первым словом стоит "const". Мы не сможем менять именно у неё зн ачение, обращаясь к ней как к динамической переменной:
*pcVar = 22;  // Здесь компилятор выдаст ошибку

но значение можно менять косвенным образом, поскольку это всего лишь указатель, присваивая значение переменной nVar. Поэтому смысл в таком объявлении константы совершенно теряется, если только речь идёт не о работе конкретно с адресами.
Для четвёртой переменной подпись в комментарии совершенно справедлива, т.к. при этом константа преобразовывается в не-константу. Компилятор подобного объявления не пропустит. Да и если рассудить с логической точки зрения - всё-таки можно там менять что-то или нельзя? Явная неоднозначность и она должна устранятся на момент написания алгоритма задачи, а не на момент программирования.

Консультировал: Вадим Исаев ака sir Henry (Старший модератор)
Дата отправки: 03.08.2017, 08:33
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное