Читайте также:
|
|
Каждый байт памяти компьютера имеет адрес. Загружаясь в память, наша программа занимает некоторое количество этих адресов. Адрес переменной можно получить используя операцию получения адреса &:
int main ()
{
int var1 = 11; // определим переменную
cout << &var1 << endl; // напечатаем её адрес
return 0;
}
Переменная, содержащая в себе значение адреса, называется указателем. Указатели определяются с использованием звездочки, которая означает указатель на. В определение указателя всегда включают тип данных, на который он указывает:
int* ptr;
Переменная ptr может содержать в себе адрес переменной типа int.
Если мы определяем в одной строке более чем один указатель одного и того же типа, то звездочку необходимо ставить перед именем каждой переменной:
char* ptr1, * ptr2, * ptr3; // три переменных указателя
Доступ к тому, на что указывает указатель, мы получаем, применяя звездочку, которая в этом случае является операцией разыменования, то есть получения значения переменной, на которую указывает указатель:
int var1 = 11;
int* ptr; // ptr - указатель на целое
ptr = &var1; // помещаем в ptr адрес переменной var1
cout << *ptr << endl; // показываем содержимое переменной через указатель
Адрес, который помещается в указатель, должен быть одного с ним типа. Однако существует тип указателя, который может указывать на любой тип данных. Он называется указателем на void и определяется следующим образом:
void* ptr; // указатель, который может указывать на любой тип данных
указатель на любой тип данных используется в ситуациях, когда один и тот же указатель должен хранить адреса переменных разных типов.
Доступ к элементам массива можно получить как используя операции [ ], так и используя указатели. Например, результат действия выражения *(intarray+3) — тот же, что и выражения intarray[3].
Мы хотим получить четвертый элемент массива, а не его четвертый байт. Именно для того, чтобы осуществлять правильный доступ к элементам массива, компилятору необходимо знать, на переменные какого типа указывает указатель. Он умножает значение индекса на размер элемента.
Использование модификатора const при объявлении указателя может означать один из двух вариантов в зависимости от его расположения:
const int* cptrInt; // указатель на константу
int* const ptrcInt; // константный указатель
Используя первый вариант объявления указателя, вы не можете изменять значение переменной, на которую указывает указатель cptrInt, но можете изменять значение самого указателя cptrInt. Если вы воспользуетесь вторым вариантом, то все будет наоборот. Вы не сможете изменять значение самого указателя cptrInt, но сможете изменять значение того, на что cptrint указывает. Можно использовать const в обеих позициях и сделать константами как сам указатель, так и то, на что он указывает.
Могут существовать указатели на указатели. Такие переменные определяются с использованием двойной звездочки, например int** pptr.
Дата добавления: 2015-08-17; просмотров: 60 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Базовый и производный классы. Конструкторы производного класса. Перегрузка методов при наследовании. Алгоритм выбора перегруженного метода. | | | Управление памятью. Операции new и delete. Указатель this. |