Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sunman
56 / 56 / 4
Регистрация: 02.03.2010
Сообщений: 406
#1

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

14.03.2011, 23:40. Просмотров 452. Ответов 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 прежним?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2011, 23:40     Разъясните ситуацию с ссылками.
Посмотрите здесь:

Функция get() разъясните ситуацию - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; int main() { setlocale(LC_CTYPE, &quot;russian&quot;); char...

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

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

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

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

Обработать исключительную ситуацию деления на нуль - C++
Помогите написать программу с обработкой исключительной ситуации деления на нуль, пожалуйста. Вот тут что то есть, или это не то? Я что то...

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

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

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

Разъясните задание - C++
Есть файл(.txt) с символами,нужно следующее сделать Записать в новый файл символы из исходного, преобразованные следующим образом:...

Списки разъясните - C++
Совсем недавно начал изучать списки и всё никак не могу понять, как их реализовывать правильно в си. Собственно код написал ниже, но вот ...

Разъясните код - C++
Здравствуйте! Расскажите, пожалуйста, что обозначает это, почему вообще так пишется: #define STATE(name) DWORD WINAPI name(DWORD...

Разъясните пожалуйста - C++
int sd(int n, int d = 1) { if(n == 0) { return 0; } else { return d &lt;= n ? (n % d == 0...


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

Или воспользуйтесь поиском по форуму:
Sunman
56 / 56 / 4
Регистрация: 02.03.2010
Сообщений: 406
15.03.2011, 15:19  [ТС]     Разъясните ситуацию с ссылками. #10
Подскажите тогда, что означает запись вида:
double &dr=(double&)x; ?
Yandex
Объявления
15.03.2011, 15:19     Разъясните ситуацию с ссылками.
Ответ Создать тему
Опции темы

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