Указатели чаще всего используют при работе с динамической памятью, называемой некоторыми программистами кучей (перевод с английского языка слова heap). Это свободная память, в которой можно во время выполнения программы выделять место в соответствии с потребностями. Доступ к выделенным участкам динамической памяти, называемым динамическими переменными, производится только через указатели. Время жизни динамических переменных – от точки создания до конца программы или до явного освобождения памяти. В С++ используется два способа работы с динамической памятью. Первый использует семейство функций mal1ос (calloc)и достался в наследство от С, второй использует операции newи delete.
При определении указателя надо стремиться выполнить его инициализацию, то есть присвоение начального значения. Непреднамеренное использование неинициализированных указателей – распространенный источник ошибок в программах. Инициализатор записывается после имени указателя либо в круглых скобках, либо после знака равенства.
Существуют следующие способы инициализации указателя:
присваивание указателю адреса существующего объекта:
• с помощью операции получения адреса
int а = 5; // целая переменная
int* p= &a; // в указатель записывается адрес а
int* р (&a); // то же самое другим способом
• с помощью значения другого инициализированного указателя:
int* r = р;
• с помощью имени массива или функции, которые трактуются как адрес :
int b[10]:
int* t = b; // присваивание адреса начала массива
void f(int а ) {(/* ... */ } // определение функции
void (*pf)(int); // указатель на функцию
рf=f; // присваивание адреса функции
Присваивание указателю адреса области памяти в явном виде:
char* vp = (char *) 0xB8000000;
Здесь 0хВ8000000 ––шестнадцатеричная константа, (char *) –– операция приведения типа: константа преобразуется к типу «указатель на char».
Для примера определим указатель – константу key_byteи свяжем его с байтом, отображающим текущее состояние клавиатуры ПЭВМ IBM PC:
char * const key_byte =(char *)1047;
Значение указателя невозможно изменить, он всегда показывает на байт с адресом 1047 (шестнадцатеричное представление 0х417). Это так называемый байт состояния клавиатуры. Так как значение указателя-константы изменить невозможно, то имя указателя-константы можно считать наименованием конкретного фиксированного адреса участка основной памяти. Содержимое этого участка с помощью разыменования указателя-константы в общем случае доступно как для чтения, так и для изменений. Следующая небольшая программа демонстрирует это.
#include <iostream.h>
void main()
{char *const key_b=(char *)1047;
cout<<"\n Байт состояния клавиатуры – "<< *key_b;
*key_b='Ё';
cout<<"\n Байт состояния клавиатуры – "<< *key_b;
}
Присваивание пустого значения
int* suxx = NULL
int* rulez = 0;
В первой строке используется константа NULL, определенная в некоторых заголовочных файлах С как указатель, равный нулю, хотя можно использовать и просто 0.
Выделение участка
• c помощью операции new, синтаксис:
new имя_типа
или