Программирование >>  Дополнительные возможности наследования 

1 ... 59 60 61 [ 62 ] 63 64 65 ... 265


1 4N В начале программы объявляются и инициализируются три переменные: в строке 8 - переменная типа unsigned short, в строке 9 - типа unsigned long, а в строке 10 - типа long. Затем в строках 12-16 выводятся значения и адреса этих переменных, полученные с помощью оператора адреса (&).

При запуске профаммы на компьютере с процессором 80386 значение переменной shortVar равно 5, а ее адрес - 0x8fc9:fff4. Адрес размещения переменной выбирается компьютером и может изменяться при каждом последующем запуске профаммы. Поэтому ваши результаты могут отличаться от приведенных. Причем разница между двумя первыми адресами будет оставаться постоянной. При двухбайтовом представлении типа short эта разница составит 2 байта, а разница между третьим и четвертым адресами - 4 байта при четырехбайтовом представлении типа long. Порядок размещения этих переменных в памяти показан на рис. 8.2.

В большинстве случаев вам не придется непосредственно манипулировать адресами переменных. Важно лишь знать, какой объем памяти занимает переменная и как получить ее адрес в случае необходимости. Программист лишь указывает компилятору объем памяти, доступный для размещения статических переменных, после чего размещение переменной по определенному адресу будет выполняться автоматически. Обычно тип long имеет четырехбайтовое представление. Это означает, что для хранения переменной этого типа потребуется четыре байта машинной памяти.

Использование указателя как среуства хранвноя аурвса

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

Допустим, что переменная howOld имеет тип int. Чтобы объявить указатель рАде для хранения адреса этой переменной, наберите следующий фрагмент кода:

int *pAge = 0;

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

Отметим, что рАде ничем не отличается от любой другой переменной. При объявлении переменной целочисленного типа (например, int) мы указываем на то, что в ней будет храниться целое число. Когда же переменная объявляется указателем на какой-либо тип, это означает, что она будет хранить адрес переменной данного типа. Таким образом, указатели являются просто отдельным типом переменных.

В данном примере переменная рАде инициализируется нулевым значением. Указатели, значения которых равны О, называют пустыми. После объявления указателю обязательно должно присваиваться какое-либо значение. Если заранее не известно, какой адрес должен храниться в указателе, ему присваивается значение 0. Неинициализированные указатели в дальнейшем могут стать причиной больших неприятностей.

Поскольку при объявлении указателю pAge было присвоено значение о, далее ему нужно присвоить адрес какой-либо переменной, например howOld. Как это сделать, показано ниже:

unsigned short int howOld = 50; объявляем переменную unsigned short int рАде = 0; объявляем указатель

pAge = &how01d; Присвоение указателю pAge адреса переменной

howOld



LongVar

ShortVar

SVar

1-\-I-\-I I I Г

1-\-\-\-г

00000000

00000101

65.535 A

-65.535

0000 0000 1111 1111 1000 0000 1111 1111 0000 0000 1111 1111 0000 0000 1111 1111

ffed

I I I I

fffS

fffi

ftef

ffeb

fff4 ffi2 fHO ffee ffec

Puc. 8.2. Схема сохранения переменной в памяти

ffe9

ffea ffee

ffe7

ffeS

tle3

ffe6

ffe4



в первой строке объявлена переменная howOld типа unsigned short int и ей присвоено значение 50. Во второй строке объявлен указатель рАде на тип unsigned short int, которому присвоено значение 0. Символ звездочка ( ), стоящий после наименования типа, указывает на то, что описанная переменная является указателем.

В последней строке указателю рАде присваивается адрес переменной howOld. На это указывает оператор адреса (&) перед именем переменной howOld. Если бы этого оператора не было, присваивался бы не адрес, а значение переменной, которое также может являться корректным адресом.

В нащем случае значением указателя рАде будет адрес переменной howOld, значение которой равно 50. Две последние строки рассмотренного фрагмента программы можно объединить в одну:

unsigned short int howOld = 50; объявляем переменную

unsigned short int * pAge = &how01d; объявляем указатель на переменную howOld

Теперь указатель pAge содержит адрес переменной howOld. С помощью этого указателя можно получить и значение переменной, на которую он указывает. В нащем примере это значение равно 50. Обращение к значению howOld посредством указателя рАде называется операцией разыменования или косвенного обращения, поскольку осуществляется неявное обращение к переменной howOld, адрес которой содержится в указателе. Далее вы узнаете, как с помощью разыменовывания возвращать значения переменных.

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

Имена указателен

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

Оператор разыменования

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

В отличие от указателя, при обращении к обычной переменной осуществляется доступ непосредственно к ее значению. Например, чтобы объявить новую переменную типа unsigned short int, а затем присвоить ей значение другой переменной, можно написать следующее:

unsigned short int yourAge; yourAge = howOld;

При косвенном доступе будет получено значение, хранящееся по указанному адресу. Чтобы присвоить новой переменной yourAge значение howOld, используя указатель рАде, содержащий ее адрес, напищите следующее:

unsigned short int yourAge; yourAge = *pAge;

Оператор разыменования (.) перед переменной pAge может рассматриваться как значение, хранящееся по адресу . Таким образом, вся операция присваивания означает: получить значение, хранящееся по адресу, записанному в рАде, и присвоить его переменной yourAge .



1 ... 59 60 61 [ 62 ] 63 64 65 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика