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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
ViviSex&I
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 9
#1

Подмена переменных для ссылок - C++

04.01.2011, 14:50. Просмотров 1521. Ответов 23
Метки нет (Все метки)

В общем, такое дело: преподаватель задала вопрос, на который я не смог ответить - как сделать так, что бы ссылка инициализированная на одну переменную указывала на другую?

Мои размышления:
Ссылка не может указывать на нул, по-этому поиграться с областью видимости, как это можно делать с указателями не получиться. Так же ссылка не дает инициализировать себя на указатель, хотя это немного не по условию, но результат был бы схож. Остается, как я понимаю, только работа с памятью. Поискал, но на вопрос ответа не нашел.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2011, 14:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подмена переменных для ссылок (C++):

Использование ссылок и обычных имен переменных - C++
Добрый вечер, у меня такой вопрос. Может быть он покажется довольно неинтересным вам, но мне просто надо понять кое-что. Ссылка - это...

Auto для определения ссылок - C++
Можете подсказать логику работы auto, почему при const int i = 1; auto& ref = i; // реф - const int& а при auto& ref = 23;...

Какие операции доступны для целочисленных переменных и недоступны для вещественных? - C++
Какие операции доступны для целочисленных переменных и недоступны для вещественных? 1.Арифметические операции (сложение, вычитание,...

Почему для обозначения ссылок используется именно символ &? - C++
Почему для обозначения ссылок используется именно символ &, а не какой-то другой? Ведь сам по себе символ & является оператором получения...

Написать (переделать) программу с использованием ссылок в качестве параметров функций для нахождения минимального элемента из 3-х заданных - C++
Просто нахождение написал. Подскажите как использовать ссылки (&) в качестве параметров функций. #include "stdafx.h" #include...

Как можно бы создать метод для ввода размерности (т.е. для ввода private переменных n,m)? - C++
Как можно бы создать метод для ввода размерности (т.е. для ввода private переменных n,m)? ( что только я не пробывал: то переменные...

23
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
04.01.2011, 17:29 #2
ссылка на ссылку
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
04.01.2011, 17:39 #3
Вопрос такой:
В ячейке памяти записан адрес. Как записать туда другой адрес?
0
ViviSex&I
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 9
04.01.2011, 18:13  [ТС] #4
Цитата Сообщение от igorrr37 Посмотреть сообщение
ссылка на ссылку
А смысл? Имеется ввиду, что в любом месте программы она должна смочь указывать на другую переменную

Вопрос по теме: имя переменной тоже ссылка?
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
04.01.2011, 18:38 #5
Я бы так переформулировал вопрос: как компилятор рассматривает имя переменной- как собственно имя или как ссылку, то есть адрес переменной?

Оказывается, двояко. Всё зависит от того КАК он использует это имя
Итак: код:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
void f_0 (int& per) {
}
void f_1 (int per) {
}
 
int main() {
 int per= 6;
 f_0 (per); 
 f_1 (per); 
}
Функции f_1 и f_0 вызываются с одни и тем же аргументом. Но! В первом случае компиляттор передаст функции число 6, а во втором- адрес этой шестёрки. А и в том и другом случае аргумент "per"

Уж ты поверь мне, смотрено в OllyDbg
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,199
Записей в блоге: 27
04.01.2011, 19:47 #6
Цитата Сообщение от ViviSex&I Посмотреть сообщение
В общем, такое дело: преподаватель задала вопрос, на который я не смог ответить - как сделать так, что бы ссылка инициализированная на одну переменную указывала на другую?
А воспроизведи вопрос дословно. При такой постановке вопроса ответ "никак". Ссылку для того и придумали, чтобы её можно было только один раз проинициализировать. Если ты (или преподаватель) не путаешь понятия "ссылка" и "указатель".

Цитата Сообщение от kravam Посмотреть сообщение
Но! В первом случае компиляттор передаст функции число 6, а во втором- адрес этой шестёрки. А и в том и другом случае аргумент "per"
Ну и где ссылка во втором случае? И где "что бы ссылка инициализированная на одну переменную указывала на другую"?
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
04.01.2011, 19:52 #7
Ой, мама, ой
Я перепутал

В первом случае положит в стек адрес переменной. Ссылку то бишь. А во втором значение 6.
0
vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
04.01.2011, 20:04 #8
Цитата Сообщение от kravam Посмотреть сообщение
Я бы так переформулировал вопрос: как компилятор рассматривает имя переменной- как собственно имя или как ссылку, то есть адрес переменной?

Оказывается, двояко. Всё зависит от того КАК он использует это имя
Итак: код:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
void f_0 (int& per) {
}
void f_1 (int per) {
}
 
int main() {
 int per= 6;
 f_0 (per); 
 f_1 (per); 
}
Функции f_1 и f_0 вызываются с одни и тем же аргументом. Но! В первом случае компиляттор передаст функции число 6, а во втором- адрес этой шестёрки. А и в том и другом случае аргумент "per"

Уж ты поверь мне, смотрено в OllyDbg
могу ошибаться, но помоему, в вашем примере в обоих случаях мы имеем дело с объектом. На определенном уровне абстракции это выглядит как передача объекта в случае ссылки и его копирование в случае передачи по значению. Если копать ниже, то адресс ячейки используется всегда и везде как минимум для считывания.
0
ViviSex&I
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 9
04.01.2011, 20:16  [ТС] #9
Цитата Сообщение от Evg Посмотреть сообщение
А воспроизведи вопрос дословно.
Увы не смогу. Смысл сохранил.
Цитата Сообщение от Evg Посмотреть сообщение
Если ты (или преподаватель) не путаешь понятия "ссылка" и "указатель".
Да, вроде, не должны ни я ни она. С указателем было бы все просто.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.01.2011, 20:37 #10
Вообще ссылка в некотором контексте тоже может обозначать указатель. Например нет такого понятия "передача параметра в функцию по указателю", есть понятие "передача по ссылке". А вот какие средства используются для того, чтобы передать по ссылке, это уже чётко указывается, например "Передача параметра по ссылке с помощью указателя" или "Передача параметра по ссылке с помощью ссылки".
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
04.01.2011, 21:08 #11
Цитата Сообщение от vx5 Посмотреть сообщение
Если копать ниже, то адресс ячейки используется всегда и везде как минимум для считывания.
Да, так. Но я бы не стал обращать на это внимание автора, дабы не запутать и ограничился тем уровнем углубления, которым ограничился. Я, кстати, делал в похожей теме скриншот отладчика и выкладывал его сюда и стек там показывал и что лежит на его верхушке. Щас мне этой темы, естессно, не найти.

А вот моя тема, может, пригодится.
Переменные ссылочного типа. Просьба разжевать и положить в рот.
2
vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
04.01.2011, 21:56 #12
цитата из страуструпа:
Ссылку можно интерпретировать, как автоматически разыменовываемый постоянный указатель или альтернативное имя объекта. Указатели и ссылки отличаются следующими особенностями:
1) Присвоение чего-либо указателю изменяет значение указателя , а не объекта на который он установлен.
2) Для того, чтобы получить указатель , как правило, необходимо использовать операторы new или &
3) Для доступа к объекту на который установлен указатель, используются операторы *, []
4) Присвоение ссылке нвоого значения изменяет то, на что она ссылается, а не саму ссылку
5) После инициализации ссылку невозможно установить на другой объект.
6) Присвоение ссылок основано на глубоком копировании (новое значение присваивается объекту, на который указывает ссылка); присвоение указателей не использует глубокое копирование(новое значение присваивается указателю, а не объекту)
7) Нулевые указатели представляют опасность
1
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.01.2011, 21:59 #13
vx5, вроде в новом стандарте будут переназначаемые ссылки, только вот немного не понятно, какой в них смысл...
1
ViviSex&I
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 9
04.01.2011, 22:29  [ТС] #14
Спасибо всем. Похоже вопрос просто на проверку знаний. Я должен был сразу ответить что нельзя, а подумал, что с памятью как-то подшаманить можно.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.01.2011, 22:48 #15
ViviSex&I, дело в том, что ссылка - это не переменная, под неё даже памяти не выделяется, поэтому с этой самой памятью никак и не удастся "подшаманить". Это просто второе имя объекта, компилятор знает, что объект может называться так (имя самого объекта), а может так (имя ссылки). Именно поэтому ссылку нужно инициализировать при объявлении, потому что она сама никуда не сохраняется и нельзя потом вернуться к объявленной ранее ссылки и инициализировать её, поскольку "потом вернуться" - это, по сути, обратиться к памяти, по которой она находится, а памяти под неё, как я уже сказал, не выделяется.
0
04.01.2011, 22:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2011, 22:48
Привет! Вот еще темы с ответами:

Поменять местами значения целых переменных х и у не используя дополнительных переменных - C++
Знаю, что это очень простая задача, но никак не могу сделать, пожалуйста помогите!!! Поменять местами значения целых переменных х и у не...

Даны 5 переменных a,b,c,d,e - необходимо каждой из этих переменных присвоить число из текстового документа - C++
Есть у меня текстовый документ, в котором записаны 5 чисел. Каждое число в новой строчке. Предположим: 893 42 8 745 43 Даны 5...

Задание переменных для подпрограмм - C++
Добрый день! Не получается задать переменные для подпрограмм (a, b, N), их надо задать с консоли для всех 3-х подпрограмм. Подскажите...

Тип переменных для LPCTSTR? - C++
День добрый. Пишу на Lua, но вот пришлось делать dll для lua на c++. Внедрил в свою dll функцию с w32, но MVisual C++ 2010 тут же...


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

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

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