|
Программирование >> Дополнительные возможности наследования
Оператор разыменования можно использовать с указателями двумя разными способами: для объявления указателя и для его разыменовы-вания. В случае объявления указателя символ звездочки сигнализирует компилятору, что это не простая переменная, а указатель, например: 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
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;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |