Глава 8
Оператор адреса и обращение к адресу локальной переменной
// Listing 8.1 Demonstrates address of operator
int main()
// using namespace std;
unsigned short shortVar = 5;
cout << "shortVar:\t" << shortVar;
cout << "longVar:\t" << longVar;
cout << "sVar:\t\t" << sVar;
return 0;
Сначала в программе объявляются и инициализируются три переменные
разных типов.
Затем выводятся значения переменных и адреса переменных
cout << "shortVar:\t" << shortVar;
Результат выполнения програмы:
shortVar: 5 Address of shortVar: 0012FF7C
Вверх
Каждая переменная имеет адрес. Даже не зная сам адрес(номер ячейки)
Предположим что существует переменная howOld типа integer.
Этой строкой переменная pAge объявляется указателем на тип int.
Следует отметить что pAge - обычная переменная. При объявлении переменной
Когда переменная объявляется указателем на какой-либо тип, то это значит
Вверх
В вышеуказанном примере переменная pAge инициализируется нулевым значением.
Неинициализированные указатели называются дикими (wild pointer).
Присвоить адрес переменной howOld указателю pAge можно следующим
Можно несколько сократить эту запись объединив две послдение
Теперь указатель pAge содержит адрес переменной howOld.
Доступ к значению переменной по ее указателю называется косвенным,
Косвенное обращение подразумевает получение доступа к значению
Всегда инициализируйте указатели. Неинициализированные указатели называются
У обычной переменной тип в объявлении сообщает компилятору,
Например:
В этом объявлении указателя pAge на переменную типа
Вверх
Нормальные переменные обладают прямым доступом к собственным
Оператор косвенного доступа (*) перед переменной pAge означает,
В указателях звездочка (*) используется двумя разными способами:
- при объявлении указателя,
При объявлении указателя звездочка (*) является частью синтаксиса
При ссылке на указатель, звездочка (оператор косвенного доступа
Заметьте что тот же самый символ (*) ипользуется как оператор
Вверх
Очень важно понимать разницу между указателем, адресом хранимым
Рассмотрим фрагмент кода:
В первой строке объявляется переменная целого типа theVariable,
Ниже на картинке схематически показана переменная theVariable
Назад |
Начало урока |
Вверх |
Вперед
Оператор обращения к адресу (&)
// and addresses of local variables
#include <iostream.h>
unsigned long longVar = 65535;
long sVar = -65535;
cout << "\tAddress of shortVar:\t";
cout << &shortVar << "\n";
cout << "\tAddress of longVar:\t" ;
cout << &longVar << "\n";
cout << "\tAddress of sVar:\t" ;
cout << &sVar << "\n";
Анализ:
unsigned short shortVar=5;
unsigned long longVar=65535;
long sVar = -65535;
cout << "\tAddress of shortVar:\t";
cout << &shortVar << "\n";
cout << "longVar:\t" << longVar;
cout << "\tAddress of longVar:\t" ;
cout << &longVar << "\n";
cout << "sVar:\t\t" << sVar;
cout << "\tAddress of sVar:\t" ;
cout << &sVar << "\n";
longVar: 65535 Address of longVar: 0012FF78
sVar: -65535 Address of sVar: 0012FF74
Сохранение адреса в указателе
значение его можно сохранить в другой переменной. Такая переменная,
хранящая адрес другого объекта называется указателем (pointer).
Чтобы объявить на нее указатель с именем pAge, можно написать:
int * pAge = 0;
Это означает что pAge будет содержать адрес значения типа int.
Компилятор различает тип переменной, адрес которой будет храниться
в указателе. При несовпадении типов будет выдано сообщение об ошибке.
целочисленного типа (например int) указывается что в ней будет
будет храниться целое число, и компилятор выделит под нее соответствующее
количество памяти.
что она будет хранить адрес переменной определенного типа
(обычно
размер самого указателя 4 байта). Таким образом указатели являются просто
определенным типом переменных.
Пустые и дикие указатели
Указатели, значения которых равны 0 называются пустыми (null pointer).
После объявления указателю обязательно надо присвоить какое-либо
значение. Если заранее неизвестно какой адрес должен храниться в
указателе, ему присваивается значение 0.
Они очень опасны.
образом:
unsigned short int howOld = 50;
unsigned short int * pAge = 0;
pAge = &howOld;
строки в одну:
unsigned short int howOld = 50;
unsigned short int * pAge = &howOld;
С помощью этого указателя можно получить и значение переменной,
на которую он указывает, в данном случае - 50.
поскольку осуществляется он не совсем по правилам.
переменной по адресу, содержащемуся в указателе.
дикими. (wild pointer). Можно указатель инициализировать нулевым
значением. Такой указатель называется пустым (null pointer)
сколько памяти необходимо для размещения ее значения.
Тип указателя предназначен вовсе не для этого: размер всех
указателей - 4 байта. Тип указателя сообщает компилятору,
сколько памяти необходимо для объекта, адрес которого указатель
содержит!
unsigned short int * pAge = 0;
unsigned short int компилятору сообщается , что указатель
(которому нужно 4 байта для хранения адреса) будет содержать
адрес объекта типа unsigned short int, для хранения значения
которого достаточно двух байтов.
Оператор косвенного доступа (*)
Оператор косвенного доступа (*) называется так же оператором
взятия значения, разыменования или ссылкой (dereference).
При извлечении значения из этого указателя будет возвращено
то значение, которое хранится по адресу, содержащемуся в указателе.
значениям. Если создать новую переменную типа unsigned short int
с именем yourAge и присвоить ей значение другой переменной, howOld,
то можно было бы написать:
unsigned short int yourAge;
yourAge = pAge;
что "Само значение находится по адресу..." или иными словами:
"Возьмите значениею. хранимое по адресу находящемуся в переменной pAge,
и присвойте его переменной yourAge ".
- а так же в операторе косвенного доступа.
и располагается после указания типа объекта.
Например:
unsigned short int * pAge = 0;
или взятия значения) означает что речь идет о значении в памяти,
находящемся по адресу в данной переменной. а не о самом адресе.
*pAge = 5;
умножения. Что именно имел в иду программист поставив звездочку,
компилятор определяет исходя из контекста.
Указатели, адреса и переменные
в указателе, и значением расположенным по адресу, содержащемуся
в указателе. Обычно именно это и составляет основную сложность
при изучении указателей.
int theVariable = 5;
int *pPointer = &theVariable;
которой присваивается значение 5. В следующей строке объявляется
указатель pPointer для типа int, которому присваивается адрес переменной
theVariable. Переменная pPointer является указателем и содержит адрес
переменной theVariable. Значение. хранящееся по адресу, записанному в
pPointer, равно 5.
и указатель pPointer, содержащий ее адрес.
Содержание