Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19


Download 1.98 Mb.
bet10/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   6   7   8   9   10   11   12   13   ...   53
Bog'liq
Lekcii AiSD 2015

Указателе




      1. Назначение и смысл указателей

Все программные объекты и структуры данных по их раз- мещению в памяти ЭВМ характеризуются своими адресами. Эти адреса могут (а часто и должны) каким-либо образом использо- ваться в программах, а для этого они должны где-то храниться. Для хранения адресов и используются указатели.


Указателе — это переменные, содержащие адреса других переменных или функций, в том числе членов классов (каких- либо программных объектов, например, переменных, массивов, записей, функций). Указатель на функцию содержит адрес точки входа в функцию. Размер памяти, требуемый для хранения адреса и формат этого адреса, зависят от вычислительной платформы и реализации компилятора. В современных системах общего на- значения размер указателя на данные любого типа составляет 4 байта:
siz ео f (void*...1onq doublе * ) 4
30
Указатели являются необы чны ми переменными по своему назначения — хранение адресов других переменных, но обы ч- нытп по некоторым своим свойствам , например, выполняемым операциям. Поскольку адреса являются целыми беззнаковыми числами (длинными), то указатели также относятся к простым структурам данных (целочисленным).
Так как указатель — это адрес некоторого объекта, то через него можно обращаться к этому объекту. Унарная операция & позволяет получить адрес программного объекта, поэтому опера- тор
у &х;
присваивает адрес объекта х переменной у. Операцию & можно применять только к объектам, действительно размещенным в па- мяти, конструкции вида
&(x+7)
6 2 8
недопустимы.
Унарная операция * воспринимает свой операнд как адрес некоторого объекта и использует этот адрес для выборки содер-
ЖИМОГО, ПОЭТОМ ОП ]ЭІ1ТО]Э
z *у;
присваивает переменной z значение, записанное по адресу у.
Рассмотрим ситуацию размещения в памяти переменной х:






AOOO

значение х

A001




A002



Адрес х (&х) —> у = &х




AOOO










A002







Итак, если у = S х и z = * у, то z = х


х переменная

у — её адрес (указатель)
z — содержимое адреса у
*у содержимое адреса у

Объекты, состоящие из знака * и адреса, необходимо объяв-





int *a,*b, *c;

Указатели объявляются при помощи символа *. Объявление вида


char *d;

говорит о том, что значение, записанное по адресу d, имеет тип char. Описатель, записываемый после символа *, может пред- ставлять собой более сложную конструкцию. При этом тип объ- екта, на который «указывает» указатель, определяется совокуп- ностью оставшейся части описателя и спецификатора типа:


char *(*(*var) ())[10];

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


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




  • явно заданный адрес участка памяти;

  • указатель, уже имеющий значение;

  • выражение, позволяющее получить адрес объекта с помо- щью операции &:

int i,*ip = &і;

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


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

32
объекта, т.е. *ip служит синонимом или псевдонимом имени і. Выражение *ip может использоваться везде, где допустимо ис— пользование имён объектов того типа, к которому относится ука— затель, но только в том случае, если указатель инициализирован при определении явным образом. Например, указатель а не ини- циализирован, поэтому попытки использовать выражение *а в лesой части операции присваивания, или в функции ввода непра- вомерны (именно поэтому мы говорим лишь о некоторых правах имени объекта). Значение указателя (т.е. адрес как место в памя- ти) неизвестно, а результат занесения значения в неопределенный участок памяти непредсказуем и может привести к аварийному событию.


*а = I i // Ошибочное применение



Download 1.98 Mb.

Do'stlaringiz bilan baham:
1   ...   6   7   8   9   10   11   12   13   ...   53




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling