Другие языки программирования и технологии

Ссылки в С++ принцип работы

Всем добрый день! Изучаю язык программирования С++, 4 день. Столкнулся со ссылками, прочёл две статьи, просмотрел принцип работы. И не понял, чуток зачем они нужны, на пальцах можете объяснить. Можно её использовать как lets go, т. е. функция выбралась и переходит на выражения как в случае с if? Или может каке-то другие функции, я не вижу смысл. Можете объяснить
Giga-Giga Giga-Giga
Giga-Giga Giga-Giga
1 342
они нужны для того, чтобы обращаться к памяти, которую программа получила во время выполнения.

вы можете написать int A[100]; A[12]=5; тогда размер будет всегда 100 элементов, и программа не сможет на ходу решать, какого размера массив ей нужен. Кроме того, есть технические подробности, не позволяющие выделять таким путем слишком много памяти.

а с указателями:
N=1000000; // размер мы могли посчитать или узнать от пользователя или из файла на ходу
int *A = new int[N];
A[123456]=77; //использование выглядит почти так же, как для массива
...
delete [] A; //попользовались - может вернуть память системе

кроме того, часто удобно бегать по массиву не индексами, а указателями.

Ну и при работе с классами есть свои ништяки.
АБ
Алексей Белик
55 872
Лучший ответ
Дмитрий Зырянов Это про указатели, а вопрос про ссылки.
Читай дальше. И вникай. На примерах в учебниках/методичках
И дело не в моем жлобстве, а в том, что тут целый курс тебе никто читать не будет.
А во вторых, сколько бы тебе не объясняли - пока сам не ЗАХОЧЕШЬ что-то понять и вникнуть - всё будет как горохом об стену
Алексей Попов
Алексей Попов
71 767
Ссылка - автоматически разыменовываемый при использовании указатель. Дальше разбирайся с указателями и зачем они нужны.
Дмитрий Зырянов Ещё отличие в том, что указатель можно изменить - перенаправить на другой объект (или другой адрес), для ссылки это невозможно.
Работающую программу на C/С++ можно написать используя исключительно указатели. Тогда зачем ссылка?
Дело в том, что с указателем вы может творить что угодно и компилятор этому помешать не может. Допустим, вы объявили
int *x;
Сказателем вы можете выполнить некоторые операции, например инкремент:
x+=100500;
Компилятор это пропустит. А вы уверены в том, что по смещению сто-пястсот у вас расположены валидные данные. Если уверенны, то в перед и с шашкой в буденовской фуражке.

Смысл ссылки состоит в том, что вы получаете адрес на определенную структуру данных. Да, ссылку можно делать не только на простейшие типы вроде int, но и на структуры. Если перед ссылкой стоит const, то вам запрещено менять данные в структуре, если не стоит, то можно. По сути речь идет о строгой дисциплине программирования. Вот рабочее пространство данных – в нем решайте задачу. В принципе C++ позволяет превратить ссылку в указатель, но эти приемы программирования осуждаемы. Вы уверены, то по вашей ссылке есть ячейка с адресом сто-пятсот. Никто не уверен…
Эдуард Янковский А если написать
int *const x = ...;
?
параметры в функциях это локальные копии аргументов.

если есть тип который весит много

struct S{ int i[100]; }

то следующая функция будет создавать копию объекта

void f( S s ){...

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

void f( S* s ){...

void f( S& s ){...

Указатель и ссылка это проста адрес памяти, обычно размер 4 или 8 байт.

Создаётся локальная переменная содержащая адрес. Доступ будет идти к оригинальному объекту.

Ссылки нужны больше для запрета изменения данных. Их делают константными.
Типа read only.
void f( const S& s ){...

С указателем такое не сделать.
Iliyas _
Iliyas _
1 930
Дмитрий Зырянов > Ссылки нужны больше для запрета изменения данных
Это не так. Указатель тоже может быть константный
void f( const S* s )
Парень, учись по учебнику!
Что за "lets go"? "функция выбралась и переходит на выражения " что мля?
Дойдёшь до указателей - там поймёшь
Giga-Giga Giga-Giga Ну ок, можешь посоветовать учебник? Буду признателен
Тоже начал учить плюсы и сейчас на ссылках, давай вместе?

Похожие вопросы