MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Указатель в языке C++, хорошее объяснение
15.10.2010
00:34
Раздел: Компьютер - Программирование - Язык C++

Указатель – это производный тип, который представляет собой адрес какого-либо значения. В языке Си++ используется понятие адреса переменных. Работа с адресами досталась Си++ в наследство от языка Си. Предположим, что в программе определена переменная типа int:


int x;


Можно определить переменную типа "указатель" на целое число:


int* xptr;


и присвоить переменной xptr адрес переменной x:


xptr = &x;


Надо запомнить:


  • Операция &, примененная к переменной, – это операция взятия адреса.
  • Операция *, примененная к адресу (другими словами, примененная к указателю) – это операция обращения по адресу.


Таким образом, для предыдущих определений x и y два оператора эквивалентны:


// присвоить переменной y значение x

int y = x;


// присвоить переменной y значение,

// находящееся по адресу xptr

int y = *xptr;


С помощью операции обращения по адресу можно записывать значения:


// записать число 10 по адресу xptr

*xptr = 10;


После выполнения этого оператора значение переменной x станет равным 10, поскольку xptr указывает на переменную x.


Указатель – это не просто адрес, а адрес величины определенного типа. Указатель xptr – адрес целой величины. Определить адреса величин других типов можно следующим образом:


// указатель на целое число без знака

unsigned long* lPtr;


// указатель на байт

char* cp;


// указатель на объект класса Complex

Complex* p;


Если указатель ссылается на объект некоторого класса, то операция обращения к атрибуту класса вместо точки обозначается "->", например p->real. Если вспомнить один из предыдущих примеров:


void Complex::Add(Complex x)

{

this->real = this->real + x.real;

this->imaginary = this->imaginary +

x.imaginary;

}


то this – это указатель на текущий объект, т.е. объект, который выполняет метод Add. Запись this-> означает обращение к атрибуту текущего объекта.


Можно определить указатель на любой тип, в том числе на функцию или метод класса. Если имеется несколько функций одного и того же типа:


int foo(long x);

int bar(long x);


можно определить переменную типа указатель на функцию и вызывать эти функции не напрямую, а косвенно, через указатель:


int (*functptr)(long x);

functptr = &foo;

(*functptr)(2);

functptr = &bar;

(*functptr)(4);


Для чего нужны указатели? Указатели появились, прежде всего, для нужд системного программирования. Поскольку язык Си предназначался для "низкоуровневого" программирования, на нем нужно было обращаться, например, к регистрам устройств. У этих регистров устройств вполне определенные адреса, т.е. необходимо было прочитать или записать значение по определенному адресу. Благодаря механизму указателей, такие операции не требуют никаких дополнительных средств языка.


int* hardwareRegiste =0x80000;

*hardwareRegiste =12;


Однако использование указателей нуждами системного программирования не ограничивается. Указатели позволяют существенно упростить и ускорить ряд операций. Предположим, в программе имеется область памяти для хранения промежуточных результатов вычислений. Эту область памяти используют разные модули программы. Вместо того, чтобы каждый раз при обращении к модулю копировать эту область памяти, мы можем передавать указатель в качестве аргумента вызова функции, тем самым упрощая и ускоряя вычисления.


Так же в этом разделе:
← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования