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

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

Войти
Регистрация
Восстановить пароль
 
 
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

Что содержит ссылка? - C++

27.11.2012, 20:27. Просмотров 634. Ответов 16
Метки нет (Все метки)

Почитал в нескольких местах. Везде одно и то же: "ссылка - это псевдоним". Интересно, а она вообще является отдельной переменной? То есть:
C++
1
2
int x = 2;
int &r = x;
Здесь r это ссылка (т.е. псевдоним) x. А в самой оперативной памяти r будет лежать как отдельная переменная? Я так понял, что да. Что она тогда содержит? Просто где-то прочитал, что ссылка инициализируется адресом переменной. Значит, ссылка содержит адрес. Но адрес содержит указатель, а это ссылка! Каша...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 20:27     Что содержит ссылка?
Посмотрите здесь:

Что такое ссылка на самом деле? - C++
Здравствуйте. Насколько я понимаю, ссылка - это переменная, которая на самом деле является указателем на адрес другой переменной, но с...

Циклическая ссылка h-ников, что делать? - C++
есть два h-ника ссылающиеся друг на друга, дело в том что в них есть классы использующие друг друга (переменные в классах), поэтому они...

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

Что лучше ссылка или указатель? - C++
Что лучше - ссылка или указатель?

Что передаётся в функцию, если в прототипе ссылка? - C++
void swap(int &, int &); int main() { /* ... */ swap(x,y); /* ... */ } void swap(int &rx, int...

Компилятор ругается, не разрешенная внешняя ссылка, что не так? - C++
#include <iostream> #include <stdio.h> #include <conio.h> int Resistance( int n); int n =0; int main() ...

Ссылка как параметр шаблона. Что это значит? - C++
Увидел в данной теме http://www.cyberforum.ru/cpp-beginners/thread1900008.html что шаблонный тип можно указать как ссылку. Судя по тесту...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,121
27.11.2012, 20:31     Что содержит ссылка? #2
Ссылки — это и есть синтаксический сахар над указателями.
v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
27.11.2012, 20:43     Что содержит ссылка? #3
Если напечатать адрес ссылки и адрес обычной переменной, то они будут одинаковые:
C++
1
cout << &r << " " << &x;
Получается что сама переменная одна. Но у нее два имени x и r.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
29.11.2012, 19:21  [ТС]     Что содержит ссылка? #4
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
Получается что сама переменная одна. Но у нее два имени x и r.
А как это вообще понять? Если я возьму листок бумаги и нарисую квадратик (это моя переменная в памяти компьютера), а потом впишу в него число 2, а после над квадратиком поставлю букву х. Вот это моя переменная:
C++
1
int x = 2;
А потом создам ссылку:
C++
1
int &r = x;
И тогда над квадратиком, рядом с буквой х, через запятую напишу букву r и буду понимать, что это 2 имени одной и той же переменной в памяти.

Но это ведь всё схематично, и на бумаге. А как это реализуется в компьютере? Вот это не ясно. С указателем понятно. Указатель - это отдельная переменная в памяти, в которой записан адрес. А вот что есть ссылка не ясно.

Почитал Интернет. На одном сайте нашёл такую фразу: "Ссылка не является переменной" - вообще не понял, что они имели в виду...

В Википедии про ссылки написано: "Ссылка не является указателем, а просто является другим именем для объекта." И тут же следом предложение: "В языках программирования ссылка может быть реализована как переменная, содержащая адрес ячейки памяти." Эти 2 предложения противоречат друг другу. Вначале говорится, что ссылка не является указателем, а потом, - что это переменная содержащая адрес (а это и есть указатель).

И вообще, когда говорят о ссылках, то и дело упоминают указатели. Складывается впечатление, что эти 2 понятия очень связаны. Но при этом что есть указатель подробно описано везде, а вот что есть ссылка нигде не объясняют. Просто псевдоним и всё...
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
29.11.2012, 19:35     Что содержит ссылка? #5
Alex Z, Вот и не стоит воспринимать ее сложнее, чем псевдоним =)
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,739
29.11.2012, 19:42     Что содержит ссылка? #6
Цитата Сообщение от Alex Z Посмотреть сообщение
"ссылка - это псевдоним"
именно псевдоним т.е одно и тоже
как Го́ликов и Гайдар( Аркадий Петрович не путать с Егор Тимофеевичем) одно и тоже лицо

Добавлено через 1 минуту
Цитата Сообщение от Alex Z Посмотреть сообщение
А в самой оперативной памяти r будет лежать как отдельная переменная?
нет не будет
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
Если напечатать адрес ссылки и адрес обычной переменной, то они будут одинаковые:
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,121
29.11.2012, 19:43     Что содержит ссылка? #7
ТС, возьми да посмотри, какой асм-листинг получится из такого кода(без оптимизации, а то компилятор всё нафиг повыкидывает):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void prt()
{
    int x = 2;
    int *r = &x;
    *r = 0;
}
 
void ref()
{
    int x = 2;
    int &r = x;
    r = 0;
}
Будут ровно одни и те же инструкции.
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,739
29.11.2012, 19:48     Что содержит ссылка? #8
Цитата Сообщение от NoMasters Посмотреть сообщение
Будут ровно одни и те же инструкции.
щаззз
вот под это выделится память
Цитата Сообщение от NoMasters Посмотреть сообщение
int *r = &x;
поскольку r это адрес x
а вот под это
Цитата Сообщение от NoMasters Посмотреть сообщение
int &r = x;
нет
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,121
29.11.2012, 19:53     Что содержит ссылка? #9
ValeryS, тебе предъявить листинг? Не вопрос:
alex@mbook /tmp $ g++ -O0 -S t.cpp
alex@mbook /tmp $ cat t.s
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    .file   "t.cpp"
    .text
    .globl  _Z3prtv
    .type   _Z3prtv, @function
_Z3prtv:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $2, -12(%rbp)
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    movl    $0, (%rax)
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   _Z3prtv, .-_Z3prtv
    .globl  _Z3refv
    .type   _Z3refv, @function
_Z3refv:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $2, -12(%rbp)
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    movl    $0, (%rax)
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size   _Z3refv, .-_Z3refv
    .ident  "GCC: (GNU) 4.7.2"
    .section    .note.GNU-stack,"",@progbits
Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот под это
int &r = x;
нет
Ну да, а обращаться будем через libastral.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
29.11.2012, 20:02  [ТС]     Что содержит ссылка? #10
Цитата Сообщение от ValeryS Посмотреть сообщение
нет не будет
А чем она тогда будет если не переменной?


Написано:
C++
1
2
int intOne;
int & rSomeRef = intOne;
И такой комментарий: "В строке 1 объявляется локальная целочисленная переменная intOne, а в строке 2 - ссылка на целочисленное значение rSomeRef, инициализируемая адресом переменной intOne".

Вот после прочтения этого у меня и возник этот вопрос. Тут просто говорится, ссылка инициализируется адресом. Вот я и не могу понять что к чему.
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,739
29.11.2012, 20:47     Что содержит ссылка? #11
Мдя действительно
никогда бы не подумал
но немножко изменим код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void prt()
{
    int x =2;
    int *r = &x;
    *r = 0;
    printf("%u %u \n",&x,&r);
}
 
void ref()
{
    int x =2;
    int &r = x;
    r = 0;
    printf("%u %u \n",&x,&r);
}
и что мы видим
3210428 3210416
3210428 3210428
в первом случае адреса разные
во втором одинаковые
сейчас разберусь с дизасемблером (IDA натравлю) поскольку встроенный дизасемблер(VS2008) показывает идентичный код
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.11.2012, 21:04     Что содержит ссылка? #12
ValeryS, лукавишь. Измени так (это правильно, а у тебя не правильно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void prt()
{
    int x =2;
    int *r = &x;
    *r = 0;
    printf("%u %u \n",&x,&(*r));
}
 
void ref()
{
    int x =2;
    int &r = x;
    r = 0;
    printf("%u %u \n",&x,&r);
}
Ссылка - разыменованный указатель
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
29.11.2012, 21:18  [ТС]     Что содержит ссылка? #13
Цитата Сообщение от activnaya Посмотреть сообщение
Ссылка - разыменованный указатель
А эта фраза: "...ссылка на целочисленное значение инициализируется адресом переменной..." есть ошибка или не есть ошибка? Ссылка действительно инициализируется адресом?
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,739
29.11.2012, 21:31     Что содержит ссылка? #14
а вот она и разница
код ptr
Assembler
1
2
3
4
5
6
7
8
9
10
11
 mov     [ebp+x], 2
 lea     eax, [ebp+x]    ; 0028F710
 mov     [ebp+r], eax
 mov     eax, [ebp+r]    ; 0028F710
 mov     dword ptr [eax], 0
 mov     esi, esp
 lea     eax, [ebp+r]    ; 0028F704 адрес r
 push    eax
 lea     ecx, [ebp+x]   ; 0028F710 адрес x
 push    ecx            
 push    offset Format   ; "%u %u \n"
код ref

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
mov     [ebp+x], 2
lea     eax, [ebp+x]    ; 0028F710
mov     [ebp+r], eax
mov     eax, [ebp+r]    ; 0028F710
mov     dword ptr [eax], 0
mov     esi, esp
mov     eax, [ebp+r]  ; 0028F710 значение по адресу r  т.е  адрес x
push    eax             
lea     ecx, [ebp+x]  ; 0028F710 адрес x
push    ecx             
push    offset Format   ; "%u %u \n"
call    ds:__imp__printf
lea eax, [ebp+r] ; 0028F704 адрес r
и
mov eax, [ebp+r] ; 0028F710 значение по адресу r т.е адрес x
как видишь ведут себя по разному
но все же закладываться на дизасемблер не стоит
во первых здесь еще не прошел оптимизатор
а во вторых каждый компилятор волен создать свой код

Добавлено через 1 минуту
Цитата Сообщение от activnaya Посмотреть сообщение
Измени так (это правильно, а у тебя не правильно)
Цитата Сообщение от activnaya Посмотреть сообщение
&(*r)
и что мы получим тот же псевдоним???

Добавлено через 1 минуту
Цитата Сообщение от Alex Z Посмотреть сообщение
А эта фраза: "...ссылка на целочисленное значение инициализируется адресом переменной..." есть ошибка или не есть ошибка?
для этого есть стандарт, как он скажет так и будет
а все остальное от лукавого
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2012, 21:40     Что содержит ссылка?
Еще ссылки по теме:

Установить, что число содержит ровно две разные цифры - C++
Буду премного благодарен за помощь. Натуральное число называется двояким, если в его десятичной записи встречается не более двух...

Верно ли, что число содержит ровно три одинаковые цифры? - C++
Верно ли, что это число содержит ровно три одинаковые цифры, как, например, числа 6676, 4544, 0006 и т.д.? Помогите. Я знаю как вызвать...

error LNK2019: ссылка на неразрешенный внешний символ Что это? - C++
Всем доброго вечера что это такое за непонятная ошибка? error LNK2019: ссылка на неразрешенный внешний символ и Ошибка 2 fatal error...

LNK2019: ссылка на неразрешенный внешний символ. Что это за ошибка? - C++
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ _WinMain@16 в функции ___tmainCRTStartup C:\Documents and Settings\Димон\Мои...

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


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

Или воспользуйтесь поиском по форуму:
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.11.2012, 21:40     Что содержит ссылка? #15
Цитата Сообщение от Alex Z Посмотреть сообщение
Ссылка действительно инициализируется адресом?
Нет.
Разве что это ссылка на указатель.
Как правильно сказали выше, ссылка - это просто абстракция над указателем. Следует запомнить, что это просто разименованный указатель, тогда вы будете понимать, что такое "передача по ссылке", к примеру.
Yandex
Объявления
29.11.2012, 21:40     Что содержит ссылка?
Ответ Создать тему
Опции темы

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