Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
56 / 56 / 14
Регистрация: 02.03.2010
Сообщений: 407
1

Разъясните ситуацию с ссылками.

14.03.2011, 23:40. Показов 690. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream.h>
 void main(void)
   {
   int x=777;
   int &ir = x;
   double &dr=x;
     cout<<" x = "<<x<<endl;
     cout<<"ir = "<<ir<<endl;
     cout<<"dr = "<<dr<<endl;
     cout<<"adress x : "<<&x<<endl;
     cout<<"adress ir: "<<&ir<<endl;
     cout<<"adress dr: "<<&dr<<endl;
     x=888;
     cout<<" x = "<<x<<endl;
     cout<<"ir = "<<ir<<endl;
     cout<<"dr = "<<dr<<endl;
     cout<<"adress x : "<<&x<<endl;
     cout<<"adress ir: "<<&ir<<endl;
     cout<<"adress dr: "<<&dr<<endl;
   getchar();
   }
Получаем такой результат:
x = 777
ir = 777
dr = 777
adress x : 12ff50
adress ir: 12ff50
adress dr: 12ff40
x = 888
ir = 888
dr = 777
adress x : 12ff50
adress ir: 12ff50
adress dr: 12ff40

Почему адрес у ir и dr разный? И почему первый раз ir и dr=777, а второй раз меняется только ir ,а адрес dr прежним?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2011, 23:40
Ответы с готовыми решениями:

Функция get() разъясните ситуацию
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; int main() {...

Разъясните ситуацию с видимостью объекта
В общем узнал что внутри классов можно описывать структуры, подклассы и т.д. и т.п. Вроде удобно,...

Разъясните ситуацию с возвратом объекта или ссылки на объект
CValue my_f(15, false); CValue my_t(5, false); ... my_f = my_t + 2; ...

Разъясните ситуацию с SP1
Решил установить SP1, установил (установка прошла успешно) После очистки, дефрагментации обьем...

9
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
14.03.2011, 23:44 2
Попробую объяснить некоторые строки.

C++
1
2
3
   int x=777; // присуждаем переменной x значение 777. 
   int &ir = x; // присуждаем адресу ir адрес x. сейчас они указывают на одну область памяти
   double &dr=x; // далее присуждаем dr x. но обрати внимание на тип данных - double, а ведь он занимает в два раза больше места, чем int
1
56 / 56 / 14
Регистрация: 02.03.2010
Сообщений: 407
14.03.2011, 23:49  [ТС] 3
Цитата Сообщение от Subgrando Посмотреть сообщение
Попробую объяснить некоторые строки.

C++
1
2
3
   int x=777; // присуждаем переменной x значение 777. 
   int &ir = x; // присуждаем адресу ir адрес x. сейчас они указывают на одну область памяти
   double &dr=x; // далее присуждаем dr x. но обрати внимание на тип данных - double, а ведь он занимает в два раза больше места, чем int
Ну это ситуация с адресами как я понимаю. А что со значениями? почему ir дважды меняется, а dr один раз?
0
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
14.03.2011, 23:55 4
Мне кажется, это тоже связано с разными типами.
Попробуйте заменить double на int, что-то изменится?

В общем, здесь: double &dr=x; мы присуждаем dr ссылку на x. А там у нас 777. Компилятор автоматически преобразовывает int в double.
Когда мы поменяли x, dr не смогла найти правильный адрес, поэтому и не изменилась.

Но я и сам не уверен.
1
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
14.03.2011, 23:59 5
У вас похоже старый компилятор. VC2008 такое не позволяет сделать.
Здесь double &dr=x компилятор создает новый безымянный объект типа double, который инициализируется значением x (именно потому, что типы отличаются). И уже на этот безымянный объект устанавливается ссылка dr. Ну, и собственно, поэтому и адреса и значения отличаются.
1
56 / 56 / 14
Регистрация: 02.03.2010
Сообщений: 407
15.03.2011, 00:05  [ТС] 6
Цитата Сообщение от bigredcat Посмотреть сообщение
У вас похоже старый компилятор. VC2008 такое не позволяет сделать.
Здесь double &dr=x компилятор создает новый безымянный объект типа double, который инициализируется значением x. И уже на этот безымянный объект устанавливается ссылка dr. Ну, и собственно, поэтому и адреса и значения отличаются.
Тогда как выполнить задание?)
"Описать и инициализировать некоторым значением переменную x типа
int. Описать ссылки ir (типа int) и dr (типа double) и инициализировать их
переменной x. Напечатать адреса переменных x, ir, dr и объяснить результаты.
Изменить значение x и напечатать значения x, ir, dr. Объяснить результаты.
"

Я пользуюсь борланд девелопер студио 2006, там не ругается на типы.
0
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
15.03.2011, 00:07 7
Может, double dr = &x?
0
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
15.03.2011, 00:15 8
Цитата Сообщение от Sunman Посмотреть сообщение
Тогда как выполнить задание?)
"Описать и инициализировать некоторым значением переменную x типа
int. Описать ссылки ir (типа int) и dr (типа double) и инициализировать их
переменной x. Напечатать адреса переменных x, ir, dr и объяснить результаты.
Изменить значение x и напечатать значения x, ir, dr. Объяснить результаты.
"

Я пользуюсь борланд девелопер студио 2006, там не ругается на типы.
Ну, если в BDS2006 такое можно, так в чем дело. Результаты вы получили и напечатали. Объяснение тоже. Преподаватель, видимо, именно этого и хотел

Оффтоп
VC2008 на вот это double &dr=x говорит error C2440: инициализация: невозможно преобразовать 'int' в 'double &'


Добавлено через 2 минуты
Цитата Сообщение от Subgrando Посмотреть сообщение
Может, double dr = &x?
Это уже не ссылка, а взятие адреса переменной x. Причем в переменную double
1
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
15.03.2011, 00:22 9
Да, точно
0
56 / 56 / 14
Регистрация: 02.03.2010
Сообщений: 407
15.03.2011, 15:19  [ТС] 10
Подскажите тогда, что означает запись вида:
double &dr=(double&)x; ?
0
15.03.2011, 15:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2011, 15:19
Помогаю со студенческими работами здесь

Разъясните ситуацию с исключениями
Добрый вечер. Написал код для сортировки массива случайных чисел. Все работало отлично. Но когда я...

Разъясните ситуацию с регулярным выражением (пример выкладываю)
Почему код ниже выводит: true true Ведь &quot;12345&quot; не содержит букв. public class ForRegexTest...

проясните ситуацию по кухне обмена ссылками
обмен по схеме: сайт А ссылается на Б сайт Б ссылается на С в итоге сайт С получает...

Объясните ситуацию.
Всем доброго времени суток. Не так давно я начал изучать WinAPI и первым делом обратился к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru