Что такое указатель в программировании
Перейти к содержимому

Что такое указатель в программировании

  • автор:

Учебники. Программирование для начинающих.

Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..

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

Delphi для начинающих

Глава 8. Типы данных, определяемые программистом

Указатели

Обычно переменная хранит некоторые данные. Однако помимо обычных, существуют переменные, которые ссылаются на другие переменные. Такие переменные называются указателями. Указатель — это переменная, значением которой является адрес другой переменной или структуры данных. Графически указатель может быть изображен так, как на рис. 8.5.

Рис. 8.5. Переменная-указатель

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

  • имя — имя переменной-указателя;
  • Тип — тип переменной, на которую указывает переменная-указатель;

значок ^ показывает, что объявляемая переменная является указателем.

Приведем примеры объявления указателей:

p1: ^integer; р2: ^real;

В приведенном примере переменная p1 — это указатель на переменную типа integer, a p2 — указатель на переменную типа real.

Тип переменной, на которую ссылается указатель, называют типом указателя. Например, если в программе объявлен указатель р: ^integer, то говорят: ^р — указатель целого типа» или «р — это указатель на целое».

В начале работы программы переменная-указатель «ни на что не указывает». В этом случае говорят, что значение указателя равно NIL. Зарезервированное слово NIL соответствует значению указателя, который ни на что не указывает.

Идентификатор NIL можно использовать в инструкциях присваивания и в условиях. Например, если переменные pi и р2 объявлены как указатели, то инструкция

устанавливает значение переменной, а инструкция if р2 = NIL then ShowMessage(‘Указатель р2 не инициализирован!’);

проверяет, инициализирован ли указатель р2.

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

Помимо адреса переменной, указателю можно присвоить значение другого указателя при условии, что они являются указателями на переменную одного типа. Например, если переменные pi и р2 являются указателями типа integer, то в результате выполнения инструкции

переменные pi и р2 указывают на одну и ту же переменную.

Указатель можно использовать для доступа к переменной, адрес которой содержит указатель. Например, если р указывает на переменную 1, то в результате выполнения инструкции

значение переменной i будет равно пяти. В приведенном примере значок ^ показывает, что значение пять присваивается переменной, на которую указывает переменная-указатель.

Указатель (программирование)

Указатель (пойнтер, англ. pointer ) — переменная, диапазон значений которой состоит из адресов ячеек памяти и специального значения — нулевого адреса. Значение нулевого адреса не является реальным адресом и используется только для обозначения того, что указатель в данный момент не может использоваться для обращения ни к какой ячейке памяти.

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

Операции над указателями

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

В случае, если указатель хранит адрес какого-либо объекта, то говорят, что указатель ссылается или указывает на этот объект p.

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

Нулевой указатель

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

См. также

Wikimedia Foundation . 2010 .

Указатели (C++)

Указатель — это переменная, в которой хранится адрес памяти объекта. Указатели широко используются как в C, так и в C++ для трех основных целей:

  • для выделения новых объектов в куче,
  • передача функций другим функциям
  • для итерации элементов в массивах или других структурах данных.

В программировании в стиле C необработанные указатели используются для всех этих сценариев. Однако необработанные указатели являются источником многих серьезных ошибок программирования. Поэтому их использование настоятельно не рекомендуется, за исключением случаев, когда они обеспечивают значительное преимущество производительности, и нет неоднозначности в отношении того, какой указатель является владельцем указателя, который отвечает за удаление объекта. Современный C++ предоставляет интеллектуальные указатели для выделения объектов, итераторов для обхода структур данных и лямбда-выражений для передачи функций. Используя эти средства языка и библиотеки вместо необработанных указателей, вы сделаете программу более безопасной, проще отладить и упростить понимание и обслуживание. Дополнительные сведения см . в смарт-указателях, итераторах и лямбда-выражениях .

В этом разделе

  • Необработанные указатели
  • Константные и переменные указатели
  • новые и удаленные операторы
  • Интеллектуальные указатели
  • Практическое руководство. Создание и использование экземпляров unique_ptr
  • Практическое руководство. Создание и использование экземпляров shared_ptr
  • Практическое руководство. Создание и использование экземпляров weak_ptr
  • Практическое руководство. Создание и использование экземпляров CComPtr и CComQIPtr

Указатели в программировании на C: что такое указатель, и что он делает?

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

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

Что такое указатель?

Указатель – это переменная. Как и другие переменные, он имеет тип данных и идентификатор. Однако указатели используются таким образом, которой принципиально отличается от того, как мы используем «нормальные» переменные, и при объявлении мы должны добавить звездочку, чтобы сообщить компилятору, что данная переменная должна рассматриваться как указатель.

char *RxByte_ptr; int *ADCValue_ptr;

Идентификатор не обязательно должен содержать символы, которые помечают переменную как указатель (такие как » ptr «). Тем не менее, я очень рекомендую использовать эту практику. Это поможет вам сохранить ваши мысли более организованными, и если у вас все указатели будут помечены таким образом, другим инженерам будет легче понять ваш код.

Что делает указатель?

Он указывает. Более конкретно, он указывает на данные другой переменной или на данные, которые хранятся в памяти, но не связаны с переменной.

Рисунок 1 – На что указывает указатель

Обычно мы думаем о переменной как о чем-то, что хранит данные, а под «данным» мы подразумеваем информацию, которая будет использоваться в вычислениях, или отправляться на другое устройство, или загружаться в регистр конфигурации, или использоваться для управления пикселями LCD дисплея. Указатель – это переменная, но она не используется для хранения такого типа данных. Вернее указатель хранит адрес памяти.

Рисунок 2 – Данные о температуре хранятся в переменной, расположенной по адресу 0x01, а синяя переменная является указателем, который содержит адрес, по которому хранятся данные о температуре

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

Подкрепим эту концепцию краткой аналогией. Представьте, что я стою в библиотеке, и кто-то подходит ко мне и говорит: «Кто такой Ричард Львиное Сердце?». Если я отвечаю, говоря: «Король Англии с 1189 по 1199 года», я похож на обычную переменную. Я предоставляю информацию, данные, которые хочет получить человек. И напротив, если я отвечаю, указывая на книгу под названием «Монархи средневековой Англии», я действую как указатель. Вместо того чтобы предоставлять нужные данные, я указываю, где именно эти данные можно найти. Я до сих пор храню полезную информацию, но эта информация – это не сам факт, а место, где человек может получить доступ к этому факту.

Понятие типов данных указателей

Как вы могли заметить в приведенных выше примерах, указатели объявляются с типом данных. Возможно, это усугубляет сложность понимания, что такое указатель. Если указатель – это просто число, соответствующее адресу ячейки памяти, то как могут использоваться разные типы данных? Например, если ваш микроконтроллер имеет 4 КБ RAM, как вы можете иметь указатель с типом данных char ? Максимальное значение unsigned char составляет 255; что произойдет, если этот указатель должен указывать на переменную, расположенную по адресу памяти 3000?

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

Рассмотрим следующую диаграмму:

Рисунок 3 – Представления в памяти переменной и указателя на эту переменную

Допустим, мы используем жалкий микроконтроллер с оперативной памятью всего 11 байтов. Диапазон значений, предлагаемых 8-разрядным числом, составляет от 0 до 255, поэтому один байт памяти более чем достаточен для представления всех возможных областей памяти в этом устройстве.

Диаграмма подчеркивает тот факт, что даже переменная, объявленная как long , может быть доступна через однобайтовый указатель. Синяя переменная – это указатель, который содержит адрес 32-битной переменной Seconds_Cnt . Эта переменная использует четыре байта памяти, но адрес переменной (который в этом примере соответствует младшему значащему байту) всегда будет числом, равным или меньшим 0x0A . Указатель должен быть объявлен с типом данных long , потому что он используется вместе с переменными long , но сам указатель потребляет один байт памяти, а не четыре.

Продолжение следует.

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

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

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