Переменная типа «указатель на <тип>» — переменная, способная хранить адреса переменных с типом, указанным при ее объявлении
Синтаксис:
<тип>* <идентификатор>;
Пример:
int* pi; // pi – указатель на int
double* pd; // pd – указатель на double
char* pc; // pc – указатель на char
Условно оперативную память вычислительной машины можно представить в виде длинной ленты, последовательности "ячеек" для хранения информации. Каждая такая ячейка размером в 1 байт имеет индивидуальный номер, называемый адресом. Пусть имеется переменная целого типа:
int a, b[10];
Определим новые переменные:
int *p_a, *p_b[10];
Эти новые переменные называется указателями и могут хранить адреса размещения в оперативной памяти переменных соответствующего типа. Например, переменная p_a предназначена для хранения адреса переменной целого типа, p_b – для хранения адресов массива целого типа.
Определение адреса размещения переменной в оперативной памяти компьютера осуществляется с помощью унарной операции & :
p_a = &a; // переменной p_a присваивается адрес переменной a
С указателями (адресными переменными) можно выполнять целочисленные арифметические операции по следующим правилам:
Добавление единицы к указателю увеличивает его значение на величину, равную длине типа переменной (в байтах), на которую он указывает; тем самым обеспечивается переход в оперативной памяти к следующей переменной, расположенной вслед за текущей.
Аналогично, вычитание единицы приводит к противоположному результату
Указатели очень тесно связаны с размещением массивов данных в оперативной памяти компьютера. Имя массива в действительности является указателем на адрес первого элемента этого массива.
Операции *(b+i) и b[i] являются тождественными. Это означает, что значение элемента массива может быть получено (задано) с помощью адресных операций и наоборот.
Разыменовывание — обращение к переменной, на которую указывает указатель
Синтаксис:
*<указатель>
Тип у этого выражения — <тип> из объявления указателя
Указатель на объект любого типа можно присвоить переменной типа void*, указатели типа void* можно сравнивать друг с другом
Указатель void* – указатель на «сырую память», не имеющую типа, его нельзя разыменовывать, использовать в арифметических операциях и др.
Пример:
int i, *pi; double* pd;
void* p = &i;
Указатель на константу не может менять значение объекта, на который указывает, но может быть переуказан на другой объект
Синтаксис:
const <тип>* <идентификатор>
Константный указатель может менять значение объекта, на который указывает, но не может быть переуказан на другой объект
Синтаксис:
<тип>* const <идентификатор>
Константный указатель на константу не может менять значение объекта, на который указывает, не может быть переуказан на другой объект
Синтаксис
const <тип>* const <идентификатор>
Для выделения и освобождения динамической памяти в С++ используются операторы new и delete.
Запрос памяти во время выполнения программы
• один экземпляр
<тип>* <указатель> = new <тип>;
• n экземпляров
<тип>* <указатель> = new <тип>[n];
Освобождение памяти
• один экземпляр
delete <указатель>;
• n экземпляров
delete[] <указатель>;
Кроме этого, возможно выделение памяти с одновременной инициализацией переменных:
Int *c=new int(12);
Синтаксис объявления массива из указателей:
<тип>* <имя>[<размер>];
(<тип>*) <имя>[<размер>];
Синтаксис объявления указателя на массив:
<тип> (*<имя>)[<размер>];
Примеры:
int* array_of_pointers[5];
int (*pointer_to_array)[5];
Наряду с адресными переменными (указателями) определяется понятие ссылочных типов, которые фактически позволяют вводить дополнительные (“другие”) имена переменных величин. Для определения переменной типа ссылки используется символ & .
int i = 123;
int &j=i, *k; // теперь идентификатор j является другим именем переменной i
j = 678; // переменной i присвоено значение 678
k = &j; // адресной переменной k присваивается адрес переменной i
j++;// переменная i увеличивается на единицу
*k = 10;
j = 10;
Две последние операции эквивалентны по своим последствиям.
Ссылка должна быть инициализирована при описании, и в дальнейшем изменение ее значения не допускается.