Другие языки программирования и технологии
Ссылки в С++ принцип работы
Всем добрый день! Изучаю язык программирования С++, 4 день. Столкнулся со ссылками, прочёл две статьи, просмотрел принцип работы. И не понял, чуток зачем они нужны, на пальцах можете объяснить. Можно её использовать как lets go, т. е. функция выбралась и переходит на выражения как в случае с if? Или может каке-то другие функции, я не вижу смысл. Можете объяснить
они нужны для того, чтобы обращаться к памяти, которую программа получила во время выполнения.
вы можете написать int A[100]; A[12]=5; тогда размер будет всегда 100 элементов, и программа не сможет на ходу решать, какого размера массив ей нужен. Кроме того, есть технические подробности, не позволяющие выделять таким путем слишком много памяти.
а с указателями:
N=1000000; // размер мы могли посчитать или узнать от пользователя или из файла на ходу
int *A = new int[N];
A[123456]=77; //использование выглядит почти так же, как для массива
...
delete [] A; //попользовались - может вернуть память системе
кроме того, часто удобно бегать по массиву не индексами, а указателями.
Ну и при работе с классами есть свои ништяки.
вы можете написать int A[100]; A[12]=5; тогда размер будет всегда 100 элементов, и программа не сможет на ходу решать, какого размера массив ей нужен. Кроме того, есть технические подробности, не позволяющие выделять таким путем слишком много памяти.
а с указателями:
N=1000000; // размер мы могли посчитать или узнать от пользователя или из файла на ходу
int *A = new int[N];
A[123456]=77; //использование выглядит почти так же, как для массива
...
delete [] A; //попользовались - может вернуть память системе
кроме того, часто удобно бегать по массиву не индексами, а указателями.
Ну и при работе с классами есть свои ништяки.
Дмитрий Зырянов
Это про указатели, а вопрос про ссылки.
Читай дальше. И вникай. На примерах в учебниках/методичках
И дело не в моем жлобстве, а в том, что тут целый курс тебе никто читать не будет.
А во вторых, сколько бы тебе не объясняли - пока сам не ЗАХОЧЕШЬ что-то понять и вникнуть - всё будет как горохом об стену
И дело не в моем жлобстве, а в том, что тут целый курс тебе никто читать не будет.
А во вторых, сколько бы тебе не объясняли - пока сам не ЗАХОЧЕШЬ что-то понять и вникнуть - всё будет как горохом об стену
Ссылка - автоматически разыменовываемый при использовании указатель. Дальше разбирайся с указателями и зачем они нужны.
Дмитрий Зырянов
Ещё отличие в том, что указатель можно изменить - перенаправить на другой объект (или другой адрес), для ссылки это невозможно.
Работающую программу на C/С++ можно написать используя исключительно указатели. Тогда зачем ссылка?
Дело в том, что с указателем вы может творить что угодно и компилятор этому помешать не может. Допустим, вы объявили
int *x;
Сказателем вы можете выполнить некоторые операции, например инкремент:
x+=100500;
Компилятор это пропустит. А вы уверены в том, что по смещению сто-пястсот у вас расположены валидные данные. Если уверенны, то в перед и с шашкой в буденовской фуражке.
Смысл ссылки состоит в том, что вы получаете адрес на определенную структуру данных. Да, ссылку можно делать не только на простейшие типы вроде int, но и на структуры. Если перед ссылкой стоит const, то вам запрещено менять данные в структуре, если не стоит, то можно. По сути речь идет о строгой дисциплине программирования. Вот рабочее пространство данных – в нем решайте задачу. В принципе C++ позволяет превратить ссылку в указатель, но эти приемы программирования осуждаемы. Вы уверены, то по вашей ссылке есть ячейка с адресом сто-пятсот. Никто не уверен…
Дело в том, что с указателем вы может творить что угодно и компилятор этому помешать не может. Допустим, вы объявили
int *x;
Сказателем вы можете выполнить некоторые операции, например инкремент:
x+=100500;
Компилятор это пропустит. А вы уверены в том, что по смещению сто-пястсот у вас расположены валидные данные. Если уверенны, то в перед и с шашкой в буденовской фуражке.
Смысл ссылки состоит в том, что вы получаете адрес на определенную структуру данных. Да, ссылку можно делать не только на простейшие типы вроде int, но и на структуры. Если перед ссылкой стоит const, то вам запрещено менять данные в структуре, если не стоит, то можно. По сути речь идет о строгой дисциплине программирования. Вот рабочее пространство данных – в нем решайте задачу. В принципе C++ позволяет превратить ссылку в указатель, но эти приемы программирования осуждаемы. Вы уверены, то по вашей ссылке есть ячейка с адресом сто-пятсот. Никто не уверен…
параметры в функциях это локальные копии аргументов.
если есть тип который весит много
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 ){...
С указателем такое не сделать.
если есть тип который весит много
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 ){...
С указателем такое не сделать.
Дмитрий Зырянов
> Ссылки нужны больше для запрета изменения данных
Это не так. Указатель тоже может быть константный
void f( const S* s )
Это не так. Указатель тоже может быть константный
void f( const S* s )
Парень, учись по учебнику!
Что за "lets go"? "функция выбралась и переходит на выражения " что мля?
Дойдёшь до указателей - там поймёшь
Что за "lets go"? "функция выбралась и переходит на выражения " что мля?
Дойдёшь до указателей - там поймёшь
Giga-Giga Giga-Giga
Ну ок, можешь посоветовать учебник? Буду признателен
Тоже начал учить плюсы и сейчас на ссылках, давай вместе?
Похожие вопросы
- Для чего нужен указатель this и каков его принцип работы? Объясните пожалуйста самым простым языком, как 2+2.
- Обьясните принцип работы программы (Assembler)
- Вопрос от начинающего ))) Список вопросов (питон, Си и в принципе работа ПК) (Мало что понимаю)
- С++ Можете объяснить принцип работы данного кода?
- Я начинающий вебмастер. Создал сайт, и хотелось бы узнать мнение опытных людей. Вот ссылка сайта: [ссылка появится после проверки модератором]
- Научите устанавливать windows98. дайте все необходимые ссылки(включая ссылку на саму винду)
- Вопрос к сайто- строителям, что за теги <noindex> и зачем ими закрывать внешние ссылки?
- Какой код в HTML при котором действующая ссылка находится как бы в картинке?
- Возможно ли найти работу, зная только основы C# и принципы ООП?
- На каком принципе основывается вся работа ИИ нейросетей, почему нейросеть называется именно нейросетью?