Урок 22. Указатели / Основы Visual C++ / Visual C++
Основы Visual C++ Урок 22. Указатели
Указатель - это просто переменная, котроая содержит адрес некоторой другой переменной. Вот так, например, мы можем объявить указатель на некоторую переменную целого типа:
int * p;
А вот так на две переменные типа bool:
bool * p1, * p2;
Обратите внимание, что мы ставим звездочку перед каждой переменной.
Отсюда понятен общий синтаксис объявления указателя на некоторый тип данных:
тип_данных * имя_переменной;
Обратите внимание, что указатели бывают разных типов - указатели на целый тип, указатели на тип float и т. д., и, скажем, указатель на переменную типа int - это вовсе не одно и тоже, что указатель на переменную типа float.
Разумеется указатель может быть не только стандартного типа (int, float и т. д.), но и типа некоторого класса (в том числе и определенного вами). Например:
CMyClass * p;
Вот пример использования указателя на переменную целого типа:
#include <fstream.h>
void main(){
int k=8;
int *p; //p указывает в никуда
p=&k; //p теперь указывает на переменную k//Вывод переменной k двумя способами
cout<<k<<"\n"; //Первый способ
cout<<*p<<"\n";//Второй способ
}
Результат выполнения программы будет такой:
Обратите внимание на следующие моменты. Во-первых, для того, чтобы наш указатель показывал на конкретную переменную соответствующего типа, мы используем операцию взятия адреса (т. е. значок амперсанда &):
...
p=&k; //p теперь указывает на переменную k
...
И во-вторых, обратите внимание, как мы с помощью нашего указаетеля получаем доступ к переменной, на которую он указывает:
...
p=cout<<*p<<"\n";//Второй способ
...
Если бы мы написали просто (без звездочки):
...
p=cout<<p<<"\n";
...
, то у нас распечаталось бы не значение переменной, адрес которой хранится в нашем указателе, а сам адрес (т. е. значение указателя):
Таким образом правило очень простое - хотим получить значение адреса - берем сам указатель, хотим получить значение переменной, на которую наш указатель показывает - берем указатель с приписаннной перед ним звездочкой.
К указателям применимы стандартные операции - присваивание и другие. Вот пример на присваивание:
#include <fstream.h>
void main(){
int k=8;
int *p1=&k, *p2; //p1 указывает на переменную k,//p2 указывает в никуда
p2=p1; //p2 тоже указывает на переменную k//Вывод переменной с помощью двух указателей
cout<<*p1<<"\n"; //Первый способ
cout<<*p2<<"\n"; //Второй способ
}
А вот пример на операцию ++ :
#include <fstream.h>
void main(){
int k[2]={-3, 4}; //Задаем массив с двумя элементамиint *p=&k[0]; //p1 указывает на первый элемент массива k//Вывод первого элемента массива и его адреса
cout<<*p<<" "<<p<<"\n";
p++; //Теперь p указывает на второй элемент массива//Вывод второго элемента массива и его адреса
cout<<*p<<" "<<p<<"\n";
}
Обратите внимание, что в результате операции ++ значение указателя увеличилось на 4 (в шеснадцатеричном виде), так как размер переменной типа int - 4 байта. Таким образом значение указателя на тип int увеличивается с помощью ++ на размер переменной типа int (разумеется, аналогичное правило имеет место и для указателей на переменные других типов).