Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2009 лекции ПЯВУ часть1.doc
Скачиваний:
22
Добавлен:
27.03.2015
Размер:
823.3 Кб
Скачать

Тема 5 Указатели Объявления и инициализация переменных указателей

Указатели– это переменные, которые содержат в качестве своих значений адреса памяти [1]. С другой стороны, указатель хранит адрес переменной, которая содержит определенное значение. В этом смысле имя переменной отсылает к значению прямо, а указатель – косвенно. Ссылка на значение посредством указателя называетсякосвенной адресацией.

Указатели, подобно любым другим переменным, перед своим использованием должны быть объявлены. Следующая строка

int *countPtr, count;

объявляет переменную countPtrтипаint*(т.е. указатель на целое число) и читается как «countPtrявляется указателем на целое число» или «countPtrуказывает на объект типаint». Однако переменнаяcountобъявлена как целое число, а не как указатель на целое число. Символ*в объявлении относится только кcountPtr. Каждая переменная, объявляемая как указатель, должна иметь перед собой знак звездочки (*). Например, объявление

float *xPtr, *yPtr;

указывает, что и xPtrиyPtr являются указателями на значения типаfloat. Использование*подобным образом в объявлении показывает, что переменная объявляется как указатель. Указатели можно объявлять, чтобы указывать на объекты любого типа данных.

Указатели должны инициализироваться либо при своем объявлении, либо с помощью операции присваивания. Указатель может получить в качестве начального значения 0или адрес. Указатель с начальным значением0ни на что не указывает.

5.1. Операции над указателями

1. Операция& или операция адресации– унарная операция, которая возвращает адрес своего операнда. Например, если имеются объявления

int y = 5;

int *yPtr;

то оператор

yPtr = &y;

присваивает адрес переменной ууказателюyPtr. Говорят, что переменнаяyPtrуказывает нау. Операнд операции адресации должен бытьL-величиной (т.е. чем-то таким, чему можно присвоить значение так же, как переменной); операция адресации не может быть применена к константам, к выражениям, не дающим результат, на который можно сослаться.

2. Операция *, называемаяоперацией косвенной адресацииилиоперацией разыменования, возвращает значение объекта, на который указывает ее операнд (т.е. указатель). Например, оператор

cout << *yPtr << endl;

выведет на экран значение, на которое ссылается указатель (число 5).

Программа на рис. 5.1. демонстрирует операции с указателями.

#include <iostream>

using namespace std;

int main()

{

int a;

int *aPtr;

a= 7;

aPtr = &a;

cout << "Address a is: " << &a << endl; // 0х0012FF7C

cout << "Value aPtr is: " << aPtr << endl; // 0х0012FF7C

cout << "Value a is: " << a << endl; // 7

cout << "Value *aPtr is:" << *aPtr << endl; // 7

cout << "Proof of adding & and *" << endl;

cout << "&*aPtr is " << &*aPtr << endl; // 0х0012FF7C

cout << "*&aPtr ia " << *&aPtr << endl; // 0х0012FF7C

return 0;

}

Рис. 5.1. Операции с указателями

Ячейки памяти выводятся как шестнадцатеричные целые с помощью cout. Адресаи значениеaPtrидентичны – это подтверждает, что адресадействительно присвоен переменной указателюaPtr. Операции&и*взаимно дополняют друг друга – при их поочередном применении кaPtrв любой последовательности будет напечатан один и тот же результат.