Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Sunman
56 / 56 / 14
Регистрация: 02.03.2010
Сообщений: 407
1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
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 =...

Проясните ситуацию с пространствами имен
Имеется программа, состоящая из двух файлов, например file1.cpp и file2.cpp...

Обработать исключительную ситуацию деления на нуль
Помогите написать программу с обработкой исключительной ситуации деления на...

9
Subgrando
40 / 40 / 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
Sunman
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
Subgrando
40 / 40 / 9
Регистрация: 28.01.2011
Сообщений: 175
14.03.2011, 23:55 4
Мне кажется, это тоже связано с разными типами.
Попробуйте заменить double на int, что-то изменится?

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

Но я и сам не уверен.
1
bigredcat
370 / 317 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
14.03.2011, 23:59 5
У вас похоже старый компилятор. VC2008 такое не позволяет сделать.
Здесь double &dr=x компилятор создает новый безымянный объект типа double, который инициализируется значением x (именно потому, что типы отличаются). И уже на этот безымянный объект устанавливается ссылка dr. Ну, и собственно, поэтому и адреса и значения отличаются.
1
Sunman
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
Subgrando
40 / 40 / 9
Регистрация: 28.01.2011
Сообщений: 175
15.03.2011, 00:07 7
Может, double dr = &x?
0
bigredcat
370 / 317 / 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
Subgrando
40 / 40 / 9
Регистрация: 28.01.2011
Сообщений: 175
15.03.2011, 00:22 9
Да, точно
0
Sunman
56 / 56 / 14
Регистрация: 02.03.2010
Сообщений: 407
15.03.2011, 15:19  [ТС] 10
Подскажите тогда, что означает запись вида:
double &dr=(double&)x; ?
0
15.03.2011, 15:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2011, 15:19

Составить программу, обрабатывающую исключительную ситуацию
Составить программу на языке С++ обрабатывающую исключительную ситуацию,...

Объясните ситуацию с integer, float и double. Выводится число на единицу меньше положенного
Здравствуйте. Хотел бы разузнать, в чем дело в следующей ситуации: void...

Разъясните задание
Есть файл(.txt) с символами,нужно следующее сделать Записать в новый файл...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru