powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ccылки и указатели в Си++
6 сообщений из 31, страница 2 из 2
Ccылки и указатели в Си++
    #34892477
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HryuckinnenЧто ксается формальных параметров, там ссылки действительно превращаются в указатели.

Нах, если можно напрямую пользовать ссылаемый объект?
...
Рейтинг: 0 / 0
Ccылки и указатели в Си++
    #34892485
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> Нах, если можно напрямую пользовать ссылаемый объект?
К любому объекту адресация происходит через адрес (если он не крошечный
и не умещается в регистр). Какие ещё варианты могут быть, кроме
превращения ссылок (да и вообще всех переменных) в указатели?
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ccылки и указатели в Си++
    #34892590
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь я всех запутал:)
Короче, есть две ситуации с использованием ссылок, но с разной семантикой.
Первая ситуация - использование ссылки в качестве псевдонима переменной
Пускай переменная будет глобальная, чтоб не заморачиваться со стековым кадром. Выходной код возьмём для i8086 (меньше букв придется написать).
Код: plaintext
1.
2.
3.
4.
5.
int i =  5 ;
void main () {
    int &j = i;
    j++;
}
На выходе имеем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
.data
_i dw  5 ;
.code
_main proc
    mov ax, _i
    inc ax
    mov _i, ax
    ret
_main endp
Т.е. для j в выходном коде не создалось какой-либо дополнительной сущности, которая хранила бы адрес i или что-то в этом роде. Когда мы оперируем с j, компилятор подставляет вместо него i.
Вторая ситуация - передача параметра в функцию.
Тут использование ссылки - это указание компилятору, что передачу фактического параметра надо осуществить по адресу.
Поясню разницу (для примера опять возьму i8086 и не буду заморачиваться стековыми кадрами).

Передача по значению (без указателей и ссылок):
Код: plaintext
1.
2.
3.
void f (int a) {a++;}
int a =  5 ;
void main () {f(a);}
На выходе имеем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
.data
_a dw  5 

.code
_f proc
    mov ax, [sp+ 2 ] ; берем из стека значение
    inc ax             ; инкрементируем его
    mov [sp+ 2 ], ax ; и кладем обратно, где оно и сгинет
    ret
_f endp

_main proc
    mov ax,_a ;Копия значения
    push ax    ;кладется в стек
    call _f
    ret
_main endp
Передача по адресу с помощью ссылки:
Код: plaintext
1.
2.
3.
void f (int &a) {a++;}
int a =  5 ;
void main () {f(a);}
На выходе имеем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
.data
_a dw  5 

.code
_f proc
    mov si, [sp+ 2 ] ;Берем из стека адрес
    mov ax, [si] ; Разыменование (загрузка значения с этого адреса)
    inc ax         ;инкремент значения
    mov [si], ax ;кладем обратно по адресу
    ret
_f endp

_main proc
    mov ax, offset _a ;Адрес переменной
    push ax              ;кладется в стек
    call _f
    ret
_main endp
Передача по адресу с помощью указателя:
Код: plaintext
1.
2.
3.
void f (int *a) {(*a)++;}
int a =  5 ;
void main () {f(a);}
На выходе будет тот же код, что и с использованием ссылки. Просто компилятор знает, что формальный параметр, объявленный как ссылка - на самом деле указатель.
...
Рейтинг: 0 / 0
Ccылки и указатели в Си++
    #34893319
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Akh wrote:

> Нах, если можно напрямую пользовать ссылаемый объект?
К любому объекту адресация происходит через адрес (если он не крошечный
и не умещается в регистр). Какие ещё варианты могут быть, кроме
превращения ссылок (да и вообще всех переменных) в указатели?
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4

Собстна, первый вариант от Hryuckinnen.
...
Рейтинг: 0 / 0
Ccылки и указатели в Си++
    #34893499
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV пишет:
> Т.е. грубо говоря - ссылка - это указатель, который не может быть
> изменен,

И всегда разименован.

и должен быть инициализирован при объявлении. т.е. (если не
> извращаться с cast'ингами) гарантировано наличие объекта, на который
> ссылаемся...

и еще адресная арифметика со ссылками не работает (потому что указатель
ссылки всегда разименован).

Т.е. ссылка - это грубо говоря указатель-light.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ccылки и указатели в Си++
    #34899999
65432100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IggorrrСсылка - это разыменованный указатель.

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

указатель ссылка
адрес изменяем постоянно
значение по адресу изменяемо изменяемо

Ссылка тотже указатель со спецификатором const
const char *c и char & c - по сути одно и тоже - различие в форме, т. синтаксисе
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ccылки и указатели в Си++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]