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

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


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

unsigned short pAge = 0; обьявляетоя указатель

на переменную типа unsigned short

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

*рАде = 5; присваивает значение 5 переменной по адресу в указателе рАде

Также не путайте оператор разыменовывания с оператором умножения (*). Компилятор по контексту определяет, какой именно оператор используется в данном случае.

Указатели, адреса и перемеипые

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

Рассмотрим еще один фрагмент программы:

int theVariable = 5;

int ♦ pPointer = &theVariable ;

В первой строке объявляется переменная целого типа theVariable. Затем ей присваивается значение 5. В следующей строке объявляется указатель на тип int, которому присваивается адрес переменной theVariable. Переменная pPointer является указателем и содержит адрес переменной theVariable. Значение, хранящееся по адресу, записанному в pPointer, равно 5. На рис. 8.3 схематически показана структура этих переменных.

theVariable

переменной

pPointer

1 1 1 1

0000 0000

1 1 1 1 1

0000 0000 0000 0110

0000 0101

0000 0000 0000 0101

V J

1 1 1 1

1 1 1 1 1

100 101 102 103 104 105 Адрес

размещения

Рис. 8.3. Схема распределения памяти

107 108



ООращвнив к данными чврва укааатвлн

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

Лнсшннв 8.Z. ВОращЕннЕ к АЕнным через цкезешежц

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Листинг 8,2, Использование указателей

Sinclude <iostream,h>

typedef unsigned short int USHORT;

int mainO

USHORT myAge; переменная USHORT * pAge = 0; указатель myAge = 5;

cout << myAge; << myAge << \ n ;

pAge = &myAge; заносим в pAge адр с myAge

cout << *pAge: << *pAge << \ n\ n ;

cout *pAge = 7\ n ;

pAge = 7; присваиваем myAge значение 7 cout рАде; << рАде \ n ; cout myAge: << myAge \ n\ n ; cout myAge = 9\ n ; myAge = 9;

cout myAge: myAge \ n ; cout << рАде: *pAge \ n ;

return 0;

myAge: 5 *pAge: 5

pAge = 7 pAge: 7 myAge: 7

myAge = 9 myAge: 9 pAge: 9

Ir,: \ В программе объявлены две переменные: myAge типа unsigned short и pAge, яв-ляющаяся указателем на этот тип. В строке 10 переменной рАде присваивается значение 5, а в строке 11 это значение выводится на экран.

Затем в строке 12 указателю рАде присваивается адрес переменной myAge. С помощью операции разыменования значение, записанное по адресу, хранящемуся в указателе рАде, выводится на экран (строка 13). Как видим, полученный результат совпадает со значением



переменной myAge. В строке 15 переменной, адрес которой записан в рАде, присваивается значение 7. После выполнения такой операции переменная myAge будет содержать значение 7. Убедиться в этом можно после вывода этих значений (строки 16, 17).

В строке 19 значение myAge опять изменяется. Теперь этой переменной присваивается число 9. Затем в строках 20 и 21 мы обращаемся к этому значению непосредственно (через переменную) и путем разыменования указателя на нее.

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

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

Лнсшннв 8.3. Чшв же зенисвно в укезвшеАе?

Листинг 8.3. Что же хранится в указателе? #include <iostream.h>

Int mainO {

unsigned short int myAge = 5, yourAge = 10; unsigned short int pAge = &myAge; Указатель

cout << myAge:\ t << myAge << \ t yourAge:\ t << yourAge \ n ;

cout &myAge:\ t SmyAge \ t&yourAge;\ t &yourAge \ n

cout << pAge;\ t << pAge \ n ;

cout << *pAge:\ t << *pAge << \ n ;

pAge = &yourAge; переприсвоение указателя

cout << myAge:\ t << myAge << \ t уоигАдеД t << yourAge << \ n ; cout &myAge:\ t << &myAge \ t&yourAge:\ t &yourAge \ n cout << pAge;\ t << pAge << \ n ; cout рАдеД t *pAge \ n ; cout &pAge:\ t &pAge \ n ; return 0;

myAge:

yourAge:

&myAge;

0x355C

&yourAge:

0x355E

pAge:

0x3550

pAge:

myAge:

yourAge:

&myAge:

0x3550

&yourAge:

0x355E

pAge:

0x355E

pAge:

&pAge:

0x355A



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

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