Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
16.02.2016
Размер:
1.2 Mб
Скачать

Разыменование указателей

Для того чтобы получить (прочитать) значение, записанное в некоторой области памяти, на которую ссылается указатель, используют операцию косвенного обращения, или разыменования (*). При этом используется имя указателя со звездочкой перед ним:

long double Num = 10;

long double Flag;

long double *ptr = &Num;

Flag = *ptr;

cout « Flag;

В приведенном фрагменте объявляются две переменные двойной точности Nun и Flag и указатель (ptr) на тип long double, проинициализированный адресом переменной Num. После этого посредством косвенного доступа к переменной Flag присваивается значение, хранящееся по адресу, указанному в ptr, то есть фактически значение переменной Num, что и подтверждает вывод на печать.

На практике довольно широко применяется так называемый пустой указатель (типа void), который может указывать на объект любого типа. Для получения доступа к объекту, на который ссылается указатель void, его необходимо предварительно привести к тому же типу, что и тип самого объекта.

Рассмотрим пример, иллюстрирующий использование пустого указателя.

#include <iostream.h>

Int main()

{

char Let = 'Т';

int nNum = 9;

Void *ptr;

ptr = &Let;

*(char*)ptr = 'L';

ptr = &nNum;

*(int*)ptr = 43;

cout « Let « ' \n';

cout « nNum;

return 0;

}

Сначала создаются два разнотипных объекта Let и nNum и пустой указатель ptr, который инициализируется адресом символьной переменной. Далее ptr разыменовывается, приводится к типу char* и посредством косвенной адресации модифицируется значение символа Let. Аналогичным образом указатель инициализируется значением адреса переменной nNum, приводится к целочисленному типу, после чего становится возможным изменение содержимого переменной nNum.

Доступ к элементам массива через указатели

Имя объявляемого массива ассоциируется компилятором с адресом его самого первого элемента (с индексом 0). Таким образом, можно присвоить указателю адрес нулевого элемента, используя имя массива:

char ArrayOfChar[] = {'W,'О','R','L','D'};

char* pArr = ArrayOfChar;

Разыменовывая указатель pArr, можно получить доступ к содержимому ArrayOfChar[0]:

char Letter = *pArr;

Поскольку в C++ указатели и массивы тесно взаимосвязаны, увеличивая или уменьшая значение указателя на массив, программист получает возможность доступа ко всем элементам массива путем соответствующей модификации указателя:

// pArr указывает на ArrayOfChar[0] ('W')

pArr += 3;

// pArr указывает на ArrayOfChar[3] ('L')

pArr++;

// pArr указывает на ArrayOfChar[4] ('D')

char Letter = *pArr; // Letter = 'D';

Таким образом, после проведенных арифметических операций указатель pArr будет ссылаться на элемент массива с индексом 4.

К этому же элементу можно обратиться иным способом:

Letter = *(ArrayOfChar + 4);

// Эквивалент Letter = ArrayOfChar[4];

Присвоение значений одного массива значениям другого массива вида Array [ ] = Another [ ] или Array = Another недопустимо, так как компилятор не может самостоятельно скопировать все значения одного массива в значения другого. Для этого программисту необходимо предпринимать определенные действия (при доступе к элементам по индексу чаще всего используется циклическое присвоение).

Объявление вида

char(*Array)[10];

определяет указатель Array на массив из 10 символов (char). Если же опустить скобки, компилятор поймет запись как объявление массива из 10 указателей на тип char. Рассмотрим пример использования массива.

#include <iostream.h>

Соседние файлы в папке ЛекцииКарасева