C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 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 (разумеется, аналогичное правило имеет место и для указателей на переменные других типов).