Какие бывают указатели для чего они существуют

Указатели

Указатели

Э то, пожалуй, самая сложная и самая важная тема во всём курсе. Без понимания указателей дальнейшее изучении си будет бессмысленным. Указатели – очень простая концепция, очень логичная, но требующая внимания к деталям.

Определение

У казатель – это переменная, которая хранит адрес области памяти. Указатель, как и переменная, имеет тип. Синтаксис объявления указателей

Например
float *a;
long long *b;
Два основных оператора для работы с указателями – это оператор & взятия адреса, и оператор * разыменования. Рассмотрим простой пример.

Рассмотрим код внимательно, ещё раз

Была объявлена переменная с именем A. Она располагается по какому-то адресу в памяти. По этому адресу хранится значение 100.

Создали указатель типа int.

Теперь переменная p хранит адрес переменной A. Используя оператор * мы получаем доступ до содержимого переменной A.
Чтобы изменить содержимое, пишем

После этого значение A также изменено, так как она указывает на ту же область памяти. Ничего сложного.
Теперь другой важный пример

Будет выведено
4
4
8
4
Несмотря на то, что переменные имеют разный тип и размер, указатели на них имеют один размер. Действительно, если указатели хранят адреса, то они должны быть целочисленного типа. Так и есть, указатель сам по себе хранится в переменной типа size_t (а также ptrdiff_t), это тип, который ведёт себя как целочисленный, однако его размер зависит от разрядности системы. В большинстве случаев разницы между ними нет. Зачем тогда указателю нужен тип?

Арифметика указателей

В о-первых, указателю нужен тип для того, чтобы корректно работала операция разыменования (получения содержимого по адресу). Если указатель хранит адрес переменной, необходимо знать, сколько байт нужно взять, начиная от этого адреса, чтобы получить всю переменную.
Во-вторых, указатели поддерживают арифметические операции. Для их выполнения необходимо знать размер.
операция + N сдвигает указатель вперёд на N*sizeof(тип) байт.
Например, если указатель int *p; хранит адрес CC02, то после p += 10; он будет хранить адрес СС02 + sizeof(int)*10 = CC02 + 28 = CC2A (Все операции выполняются в шестнадцатиричном формате). Пусть мы создали указатель на начало массива. После этого мы можем «двигаться» по этому массиву, получая доступ до отдельных элементов.

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

Массив, по сути, сам является указателем, поэтому не нужно использовать оператор &. Мы можем переписать пример по-другому

Если же указатели равны, то они указывают на одну и ту же область памяти.

Указатель на указатель

У казатель хранит адрес области памяти. Можно создать указатель на указатель, тогда он будет хранить адрес указателя и сможет обращаться к его содержимому. Указатель на указатель определяется как

Очевидно, ничто не мешает создать и указатель на указатель на указатель, и указатель на указатель на указатель на указатель и так далее. Это нам понадобится при работе с двумерными и многомерными массивами. А вот простой пример, как можно работать с указателем на указатель.

Указатели и приведение типов

Т ак как указатель хранит адрес, можно кастовать его до другого типа. Это может понадобиться, например, если мы хотим взять часть переменной, или если мы знаем, что переменная хранит нужный нам тип.

В этом примере мы пользуемся тем, что размер типа int равен 4 байта, а char 1 байт. За счёт этого, получив адрес первого байта, можно пройти по остальным байтам числа и вывести их содержимое.

У казатель до инициализации хранит мусор, как и любая другая переменная. Но в то же время, этот «мусор» вполне может оказаться валидным адресом. Пусть, к примеру, у нас есть указатель. Каким образом узнать, инициализирован он или нет? В общем случае никак. Для решения этой проблемы был введён макрос NULL библиотеки stdlib.
Принято при определении указателя, если он не инициализируется конкретным значением, делать его равным NULL.

По стандарту гарантировано, что в этом случае указатель равен NULL, и равен нулю, и может быть использован как булево значение false. Хотя в зависимости от реализации NULL может и не быть равным 0 (в смысле, не равен нулю в побитовом представлении, как например, int или float).
Это значит, что в данном случае

вполне корректная операция, а в случае

поведение не определено. То есть указатель можно сравнивать с нулём, или с NULL, но нельзя NULL сравнивать с переменной целого типа или типа с плавающей точкой.

Примеры

Теперь несколько примеров работы с указателями
1. Пройдём по массиву и найдём все чётные элементы.

2. Когда мы сортируем элементы часто приходится их перемещать. Если объект занимает много места, то операция обмена местами двух элементов будет дорогостоящей. Вместо этого можно создать массив указателей на исходные элементы и отсортировать его. Так как размер указателей меньше, чем размер элементов целевого массива, то и сортировка будет происходить быстрее. Кроме того, массив не будет изменён, часто это важно.

3. Более интересный пример. Так как размер типа char всегда равен 1 байт, то с его помощью можно реализовать операцию swap – обмена местами содержимого двух переменных.

В этом примере можно поменять тип переменных a и b на double или любой другой (с соответствующим изменением вывода и вызова sizeof), всё равно мы будет обменивать местами байты двух переменных.

4. Найдём длину строки, введённой пользователем, используя указатель

Источник

Указатели в C++: зачем нужны, когда использовать и чем отличаются от обращения к объекту напрямую

Авторизуйтесь

Указатели в C++: зачем нужны, когда использовать и чем отличаются от обращения к объекту напрямую

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

Даже если большинство программистов понимают, в чем разница между объектами и указателями на них, иногда бывает не совсем понятно, в пользу какого из способов обращения к объекту стоит делать выбор. Ниже мы постарались ответить на этот вопрос.

Вопрос

Я заметил, что нередко программисты, чей код я видел, используют указатели на объекты чаще, чем сами эти объекты, т.е., например, используют следующую конструкцию:

Аналогично с методами. Почему вместо этого:

мы должны писать вот это:

Я так понимаю, что это дает выигрыш в скорости, т.к. мы обращаемся напрямую к памяти. Верно? P.S. Я перешел с Java.

Ответ

Заметим, кстати, что в Java указатели не используются в явном виде, т.е. программист не может в коде обратиться к объекту через указатель на него. Однако на деле в Java все типы, кроме базовых, являются ссылочными: обращение к ним происходит по ссылке, хотя явно передать параметр по ссылке нельзя. И еще, на заметку, new в C++ и в Java или C# — абсолютно разные вещи.

Для того, чтобы дать небольшое представление, что же такое указатели в C++, приведем два аналогичных фрагмента кода:

Ближайший эквивалент на C++:

Однако вот это – совершенно другая вещь (C++):

На самом деле, совсем нет. Работа с указателями оформлена в виде кучи, в то время как работа с объектами – это стек, более простая и быстрая структура. Если вы новичок, то у нас для вас есть материал, в котором мы подробно рассказываем, что такое стек и куча.

Строго говоря, этот вопрос объединяет в себе два различных вопроса. Первый: когда стоит использовать динамическое распределение памяти? Второй: когда стоит использовать указатели? Естественно, здесь мы не обойдемся без общих слов о том, что всегда необходимо выбирать наиболее подходящий инструмент для работы. Почти всегда существует реализация лучше, чем с использованием ручного динамического распределения (dynamic allocation) и / или сырых указателей.

Динамическое распределение

Обычно принудительное установления срока жизни применяется в следующих ситуациях:

Указатели

Однако есть случаи, когда использование указателей оправдано не только с точки зрения динамического распределения памяти, но почти всегда есть альтернативный путь, без использования указателей, который вам и следует выбрать. Как и ранее, скажем: всегда делайте выбор в пользу альтернативы, если нет особенной необходимости в использовании указателей.

Случаями, когда использование указателей можно рассматривать как возможный вариант, можно назвать следующие:

Источник

Какие бывают указатели для чего они существуют

Указатели совместно с адресной арифметикой играют в Си особую роль. Можно сказать, что они определяют лицо языка. Благодаря им Си может считаться одновременно языком высокого и низкого уровня по отношению к памяти.

Если говорить о понятиях указатель, ссылка, объект, то они встречаются не только в языках программирования, но в широком смысле в информационных технологиях. Когда речь идет о доступе к информационным ресурсам, то существуют различные варианты доступа к ним:

В языках программирования термины объект (значение), указатель и ссылка имеют примерно аналогичный смысл, но касаются способов доступа и передачи значений переменных.

· при передаче формальных параметров при вызове процедур (функций) практически во всех языках программирования реализованы способы передачи по ссылке и по значению;

· в Паскале и Си определено понятие указатель как переменная особого вида, содержащая адрес размещения в памяти другой переменной. Использование указателей позволяется создавать динамические структуры данных, в которых элементы взаимно ссылаются друг на друга;

Указатель в Си

Передавать данные между программами, данные от одной части программы к другой (например, от вызывающей функции к вызываемой) можно двумя способами :

· создавать в каждой точке программы (например, на входе функции) копию тех данных, которые необходимо обрабатывать ;

Наряду с указателем в программировании также используется термин ссылка. Ссылка – содержанием ссылки также является адресная информация об объекте (переменной), но внешне она выглядит как переменная (синоним оригинала).

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

В языках программирования имя переменной ассоциируется с адресом области памяти, в которой транслятор размещает ее в процессе трансляции программы. Все операции над обычными переменными преобразуются в команды с прямой адресацией к соответствующим словам памяти.

· указатель, который содержит адрес переменной, ссылается на эту переменную или назначен на нее;

· переменная, адрес которой содержится в указателе, называется указуемой переменной.

Какие бывают указатели для чего они существуют. Смотреть фото Какие бывают указатели для чего они существуют. Смотреть картинку Какие бывают указатели для чего они существуют. Картинка про Какие бывают указатели для чего они существуют. Фото Какие бывают указатели для чего они существуют
рис. 52-2. Определение указателя и операции над ним

Последовательность действий при работе с указателем включает 3 шага:

1. Определение указуемых переменных и переменной-указателя. Для переменной-указателя это делается особым образом.

int a,x; // Обычные целые переменнные

2. Связывание указателя с указуемой переменной. Значением указателя является адрес другой переменной. Следующим шагом указатель должен быть настроен, или назначен на переменную, на которую он будет ссылаться.

p = &a; // Указатель содержит адрес переменной a

3. И наконец, в любом выражении косвенное обращение по указателю интерпретируется как переход от него к указуемой переменной с выполнением над ней всех далее перечисленных в выражении операций.

* p =100; // Эквивалентно a =100

x = x + *p; // Эквивалентно x = x + a

(* p )++; // Эквивалентно a ++

Замечание: при обращении через указатель имя указуемой переменной в выражении отсутствует. Поэтому можно считать, что обращение через указатель производится к «безымянной» переменной, а операцию « *» называются также операцией разыменования указателя.

Какие бывают указатели для чего они существуют. Смотреть фото Какие бывают указатели для чего они существуют. Смотреть картинку Какие бывают указатели для чего они существуют. Картинка про Какие бывают указатели для чего они существуют. Фото Какие бывают указатели для чего они существуютУказатель дает « степень свободы» или универсальности любому алгоритму обраКакие бывают указатели для чего они существуют. Смотреть фото Какие бывают указатели для чего они существуют. Смотреть картинку Какие бывают указатели для чего они существуют. Картинка про Какие бывают указатели для чего они существуют. Фото Какие бывают указатели для чего они существуютботки данных. Действительно, если некоторый фрагмент программы получает данные непосредственно в некоторой переменной, то он может обрабатывать ее и только ее. Если же данные он получает через указатель, то обработка данных (указуемых переменных) может производиться в любой области памяти компьютера (или программы). При этом сам фрагмент может и «не знать», какие данные он обрабатывает, если значение самого указателя передано программе извне.

Адресная арифметика и управление памятью

Способность указателя ссылаться на «отдельно стоящие» переменные не меняет качества языка, поскольку нельзя выйти за рамки множества указуемых переменных, определенных в программе. Такая же концепция указателя принята, например, в Паскале. Но в Си существует еще одна, расширенная интерпретация, позволяющая через указатель работать с массивами и с памятью компьютера ни низком (архитектурном) уровне без каких-либо ограничений со стороны транслятора. Это «свобода самовыражения» обеспечивается одной дополнительной операцией адресной арифметики. Но сначала определим свойства указателя в соответствии с расширенной интерпретацией.

Любой указатель в Си ссылается на неограниченную в обе стороны область памяти (массив), заполненную переменными указуемого типа с индексацией элементов относительно текущего положения указателя.

· любой указатель потенциально ссылается на неограниченную в обе стороны область памяти, заполненную переменными указуемого типа;

· результатом операции указатель+i является адрес i-ой переменной (значение указателя на i-ую переменную) в этой области относительно текущего положения указателя.

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

Значение указуемой переменной

Указатель на i-ю переменную после указуемой

Указатель на i-ю переменную перед указуемой

Значение i-й переменной после указуемой

Значение i-й переменной после указуемой

Переместить указатель на следующую переменную

Переместить указатель на предыдущую переменную

Переместить указатель на i переменных вперед

Переместить указатель на i переменных назад

Получить значение указуемой переменной и переместить указатель к следующей

Переместить указатель к переменной, предшествующей указуемой, и получить ее значение

Указатель на свободную память вслед за указуемой переменной

Какие бывают указатели для чего они существуют. Смотреть фото Какие бывают указатели для чего они существуют. Смотреть картинку Какие бывают указатели для чего они существуют. Картинка про Какие бывают указатели для чего они существуют. Фото Какие бывают указатели для чего они существуютЕсли МАССИВ=ПАМЯТЬ+УКАЗАТЕЛЬ (начальный адрес), то УКАЗАТЕЛЬ=МАССИВ-ПАМЯТЬ, т.е. указатель это «массив без памяти», «свободно перемещающийся по памяти» массив.

Различия и сходства

Оба интерпретируются как указатели и оба имеют тип int *

Указатель требует настройки «на память»

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

Указатель может перемещаться по памяти относительно своего текущего положения

Идентификатор массива без скобок интерпретируется как адрес нулевого элемента нулевой строки, или указатель на базовый тип данных. В нашем примере идентификатору A будет соответствовать выражение &A[0][0] с типом char*.

Имя двумерного массива с единственным индексом интерпретируется как начальный адрес соответствующего внутреннего одномерного массива. A[i] понимается как &A[i][0], то есть начальный адрес i-го массива символов.

От такого многообразия возможностей работы с указателями нетрудно прийти в замешательство: как вообще с ними работать, кто за что отвечает? Действительно, при работе с указателями легко выйти «за рамки дозволенного», т.е. определенных самим же программистом структур данных. Поэтому попробуем еще раз обсудить принципиальные моменты адресной арифметики.

· наличие операции инкремента или индексации говорит о работе указателя с памятью (массивом) ;

· использование исключительно операции косвенного обращения по указателю свидетельствует о работе с отдельной переменной.

· неинициализированный указатель. После определения указатель ссылается «в никуда», тем не менее программист работает через него с переменной или массивом, записывая данные по случайным адресам;

· несколько указателей, ссылающихся на общий массив – это все-таки один массив, а не несколько. Если программа работает с несколькими массивами, то они должны либо создаваться динамически, либо браться из двумерного массива;

· выход указателя за границы памяти. Например, конец строки отмечается символов ‘\0’, начало же формально соответствует начальному положению указателя. Если в процессе работы со строкой требуется возвращение на ее начало, то начальный указатель необходимо запоминать, либо дополнительно отсчитывать символы.

Другие операции над указателями

В процессе определения указателей мы рассмотрели основные операции над ними:

· операция присваивания указателей одного типа. Назначение указателю адреса переменной p=&a есть одни из вариантов такой операции;

· операция косвенного обращения по указателю (разыменования указателя);

· операция адресной арифметики «указатель+целое» и все производные от нее.

Значение NULL может быть присвоено любому указателю. Если указатель по логике работы программы может иметь такое значение, то перед косвенным обращением по нему его нужно проверять на достоверность:

//— Симметричная перестановка символов строки

< char c; c=*p; *p=*q; *q=c; >// 3 стакана над переменными под указателями

extern int fread(void *, int, int, FILE *);

fread(A, sizeof(int), 20, fd);

extern void *malloc(int);

int *p = (int*)malloc(sizeof(int)*20); // Явное преобразование void* к int*

Указатель как формальный параметр и результат функции

Если же фактический параметр должен быть изменен, то формальный параметр можно определить как явный указатель. Тогда фактический параметр должны быть явно передан в виде указателя на ту переменную (с использованием операции &).

< (* pi )++; >// аналог вызова: pi = & a

inc (& a ); > // *( pi )++ эквивалентно a ++

int sum(int A[],int n) // Исходная программа

int sum(int *p, int n) // Эквивалент с указателем

< x = sum(B,10); >// аналог вызова : p = B, n = 10

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

· глобальные переменные программы;

· формальные параметры, если они являются массивами, указателями или ссылками, то есть «за ними стоят» другие переменные.

Функция не может возвратить указатель на локальную переменную или формальный параметр-значение, поскольку они разрушаются при выходе из функции. Это приводит к ошибке времени выполнения, не обнаруживаемой транслятором.

Пример: функция возвращает указатель на минимальный элемент массива. Массив передается как формальный параметр.

int *min(int A[], int n)<

int *pmin, i; // Рабочий указатель, содержащий результат

Ссылка как неявный указатель

Во многих языках программирования указатель присутствует, но в завуалированном виде в форме ссылки. Под ссылкой понимается переменная, которая не имеет самостоятельного значения, а отображается на другую переменную, т.е. является ее синонимом. Во всем остальном она не отличается от обычной переменной. В отличие от явного указателя обращение по ссылке к объекту-прототипу имеет тот же самый синтаксис, что и обращение к объекту-прототипу.

int a =5; // Переменная – прототип

b ++; // Операция над b есть операция над прототипом a

· при передаче по значению формальный параметр является копией фактического, он может быть изменен независимо от значения оригинала – фактического параметра. Такой параметр является исключительно входным;

· при передаче по ссылке формальный параметр отображается на фактический, и его изменение сопровождается изменением фактического параметра-прототипа. Такой параметр может быть как входным, так и выходным.

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

//—— Функция возвращает ссылку на минимальный элемент массива

int &ref_min(int A[], int n)<

//—— Функция возвращает указатель на минимальный элемент массива

int *ptr_min(int *p, int n)<

Строки, массивы символов и указатель char *

int n; // указателем на на строку char*

· создание массива символов с размерностью, достаточной для размещения строки;

· инициализацию (заполнение) массива символами строки, дополненной символом ‘\0’;

char * q = «ABCD»;; // Программа

char *q; // Эквивалент

В связи с этим в Си возможны довольно странные выражения с участием строковых констант:

char c2 = («12345» + 2)[1];

extern int strcmp(char *, char*);

Посмотрим, как все вышесказанное выглядит на практике.

//—- Поиск в строке заданного фрагмента

> // иначе продолжить поиск

Для обнаружения всех фрагментов достаточно передавать для каждого последующего вызова функции указатель на часть строки, непосредственно следующей за найденным фрагментом.

//—— Поиск всех вхождений фрагмента в строке

for (s=find(c,q); s!=NULL; s=find(s+strlen(q),q)) puts(s);

//—- Поиск слова максимальной длины посимвольная обработка

int n,lmax; char *pmax;

for (n=0,lmax=0,pmax=NULL; *s!=0;s++)<

n =0; // фиксация максимального значения

//—- Сортировка слов в строке в порядке убывания (выбором)

void sort(char *in, char *out)

* out ++= * q ; * q ++=’ ‘; // Переписать с затиранием

* out ++=’ ‘; // После слова добавить пробел

Лабораторный практикум

1. Функция находит минимальный элемент массива и возвращает указатель на него. С использованием этой функции реализовать сортировку выбором.

2. Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива и сравнения указателей.

3. Функция находит в строке пары одинаковых фрагментов и возвращает указатель на первый. С помощью функции найти все пары одинаковых фрагментов.

4. Функция находит в строке пары инвертированных фрагментов (например «123apr» и «rpa321») и возвращает указатель на первый. С помощью функции найти все пары.

5. Функция производит двоичный поиск места размещения нового элемента в упорядоченном массиве и возвращает указатель на место включения нового элемента. С помощью функции реализовать сортировку вставками.

6. Функция находит в строке десятичные константы и заменяет их на шестнадцатеричные с тем же значением, например «aaaaa258xxx» на «aaaaa0x102xxx».

7. Функция находит в строке символьные константы и заменяет их на десятичные коды, например «aaa’6’xxx» на «aaa54xxx».

8. Функция находит в строке самое длинное слово и возвращает указатель на него. С ее помощью реализовать размещение слов в выходной строке в порядке убывания их длины.

9. Функция находит в строке самое первое (по алфавиту) слово. С ее помощью реализовать размещение слов в выходной строке в алфавитном порядке.

10. Функция находит в строке симметричный фрагмент вида » abcdcba » длиной 7 и более символов (не содержащий пробелов) и возвращает указатель на его начало и длину. С использованием функции «вычеркнуть» все симметричные фрагменты из строки.

11. «Быстрая» сортировка (разделением) с использованием указателей на правую и левую границы массива, текущих указателей на правый и левый элемент и операции сравнения указателей (см. 7.2).

Вопросы без ответов

Определите, используется ли указатель для доступа к отдельной переменной или к массиву. Напишите вызов функции с соответствующими фактическими параметрами – адресами переменных или именами массивов.

void F(int *p, int *q, int n)<

F(A,&x,5); printf(«x=%d\n»,x); > // Выведет 13

Источник

Для чего же нужны указатели?

Указатели на функции

К ак уже обсуждалось ранее функции – это набор команд, которые расположены в соответствующей области памяти. Вызов функции – это сохранение состояния, передача аргументов и переход по адресу, где располагается функция. В си есть возможность создавать указатели на функции. Указатели на функции позволяют упростить решение многих задач. Совместно с void указателями можно создавать функции общего назначения (например, сортировки и поиска). Указатели позволяют создавать функции высших порядков (функции, принимающие в качестве аргументов функции): отображение, свёртки, фильтры и пр. Указатели на функции позволяют уменьшать цикломатическую сложность программ, создавать легко масштабируемые конструкции. Рассмотрим пример. Создадим функцию и указатель на эту функцию

Синтаксис объявления указателей на функцию (* )( );

Видео

Присваивание функции указателю на функцию

Указатель на функцию может быть инициализирован функцией (и неконстантному указателю на функцию тоже можно присвоить функцию):

Одна из распространенных ошибок, которую совершают новички:

Обратите внимание, в указателя на функцию и самой функции должны совпадать тип, параметры и тип возвращаемого значения. Например:

1234567891011 // Прототипы функций int boo ( ) ; double doo ( ) ; int moo ( int a ) ; // Присваивание значений указателям на функции int ( * fcnPtr1 ) ( ) = boo ; // ок int ( * fcnPtr2 ) ( ) = doo ; // не ок: тип указателя и тип возврата функции не совпадают! double ( * fcnPtr4 ) ( ) = doo ; // ок fcnPtr1 = moo ; // не ок: fcnPtr1 не имеет параметров, но moo() имеет int ( * fcnPtr3 ) ( int ) = moo ; // ок

В отличие от фундаментальных типов данных, язык C++ неявно конвертирует функцию в указатель на функцию, если это необходимо (поэтому вам не нужно использовать оператор адреса & для получения адреса функции). Однако, язык C++ не будет неявно конвертировать указатель на функцию в указатель типа void или наоборот.

Динамическое распределение

Формулировка вопроса подразумевает 2 способа создания объекта. Главное различие — срок их жизни (storageduration) в памяти программы.

Что касается принудительного установления срока жизни, то оно используется в следующих случаях: • надо, чтобы объект существовал и после выхода из области его видимости. Мы говорим об именно этом объекте и именно в этой области памяти, а не про его копию. Если же для вас это не является принципиальным (а чаще всего это так), следует положиться на автоопределение срока жизни; • надо применять много памяти, которая может переполнить стек. В принципе, с этой проблемой сталкиваются редко, но, бывает, приходится решать и такую задачу; • точно не известен размер массива, который придётся использовать. Вы должны знать, что в C++ массивы имеют фиксированный размер при определении. Это иногда вызывает проблемы, к примеру, во время считывания пользовательского ввода. Указатель же определяет лишь тот участок в памяти, куда записывается начало массива.

Преимущество указателей

Преимущество указателей в том, что они позволяют передать в функцию значение по ссылке. Слово «ссылка» означает, что мы не передаем значение, а ссылаемся на адрес этого значения. В этом случае можно внутри функции изменять значение элемента данных. Хотя указатель и будет уничтожен после выхода из функции, но мы изменили значение памяти по указателю и это изменение значения сохранится после выход из функции.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *