Автор: cheops (18.11.2011 в 15:43)
Указатели - это переменные специального типа, которые хранят адрес области памяти. По этому адресу может находиться что угодно, переменная, массив, объект, картинка, таблица других указателей и даже функция. Причем на одну и ту же область может ссылаться сразу несколько указателей, адреса в них можно присваивать другим указателям или передавать их в качестве параметров функций. Это очень выгодно, вместо того, чтобы копировать мегабайтный кусок памяти, вы копируете обычную переменную размером в 4 байта и тем не менее имеете возможность оперировать с этим мегабайтным куском в любом месте, куда вы переслали указатель. В случае же функции вы получаете возможность передавать в другую функцию указатель на любую другую функцию (т.е. получаете возможность гибко изменять логику программы, путем передачи для вызова различных функций).
При работе с указателями сложность вызывает то, что вы можете обращаться как к адресу, так и к значению, путем разименования указателя, а также то, что указателю нужно передавать адрес (а не значение), который необходимо получать при помощи оператора &
#include <stdio.h>
#include <iostream>
using namespace std;
// Главная функция
int main()
{
// Переменная
int i = 200;
// Указатель
int *ptr;
// Помещаем в указатель адрес переменной i
ptr = &i;
// Обращение к значению i через указатель
cout << "*ptr = " << *ptr << endl;
// Адрес, который хранится в указателе
cout << "ptr = " << ptr << endl;
// Пауза перед закрытием
system("PAUSE");
return 0;
} |
Другой сложностью является то, что указатели могут ссылаться на другие указатели и зачастую может получаться целая цепочка ссылок p1 -> p2 -> p3 и т.п.
PS Ну и совсем весело начинается, при работе с указателями на объекты, которые сами по себе довольно сложные конструкции...