КОГДА ИСПОЛЬЗУЮТСЯ УКАЗАТЛИ И ЗАЧЕМ ОНИ НУЖНЫ

Транзисторы, резисторы, микросхемы, микроконтроллеры. C/C++, C#, PHP, HTML и пр.

Модератор: KopylovSergey

Ответить
Аватара пользователя
admin
Администратор
Сообщения: 1103
Зарегистрирован: 18 янв 2012, 01:25
Откуда: Екатеринбург
Контактная информация:

КОГДА ИСПОЛЬЗУЮТСЯ УКАЗАТЛИ И ЗАЧЕМ ОНИ НУЖНЫ

Сообщение admin » 14 сен 2020, 22:40

Пример:
Положим, Вы передаете в функцию какую-то переменную. Там с ее значением что-то делается, и новое значение должно быть занесено в ту переменную, значение которой Вы в функцию передали. Если сделаете что-то типа этого

Код: Выделить всё

void func (int a) {
  a += 10;
}    
......    
int i = 2;
func(i);
То значение переменной i не изменится, потому что в функцию передается КОПИЯ этой переменной и с ней производятся операции. А если передать указатель или ссылку на эту переменную, то получите доступ НЕПОСРЕДСТВЕННО К ЕЁ ЗНАЧЕНИЮ

Код: Выделить всё

void func (int* a) {
  *a += 10;
}    
......    
int i = 2;
func(&i);
Если нужно передать в функцию структуру или объект, то передавать его целиком можно, но это может отнять кучу памяти и времени, ведь они могут быть очень большими. В простых примерах это незаметно, но в реальных программах, где это может повторяться тысячи и миллионы раз, тормоза будут огромные. Вместо этого передаете указатель или ссылку и получаете из функции доступ к объекту.
Уже говорили о динамическом выделении памяти. Если еще про это не читали, то прочитаете. Там без указателей В ПРИНЦИПЕ не обойтись.

Указатели применяют:
1. Для возврата нескольких значений из функции. В качестве аргумента передаётся указатель на переменную, функция записывает туда значение. Такой подход очень распространён в DirectX, OpenGL, Windows API и других библиотеках в стиле C. Для этого можно использовать и ссылки, но не рекомендуется, так как синтаксис передачи и возврата неотличим.
2. Для хранения адреса динамически выделенной памяти. Она отличается от обычной тем, что программист сам регулирует время жизни объектов, и её больше (а размер стека всего порядка мегабайта). Если адрес будет потерян, то память нельзя будет ни использовать, ни освободить. Возникнет утечка памяти.
3. C-строка представляет собой указатель на её первый символ.
4. Для создания различных структур данных: связанных списков, деревья и т. д.
5.Для передачи аргумента в функцию без копирования (и вызова конструктора для объектов), которое может оказаться долгим для сложных объектов. Правда, здесь лучше использовать константные ссылки.
Таким образом, примений указателей очень много.

Взято тут

Ответить