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

Пример:

int* pToInt; // Указатель на целое

int iVar;

pToInt=&iVar; // Можно две строки записать как: int *pToInt=&iVar;

*pToInt=20; // Эквивалентно записи iVar=20;

char* pToStr; // Указатель на строку

char* pToStrl="The string";

iVar=strlen(pToStrl); // Длина строки

При использовании указателей некоторой переменной может быть присвоено как значение указателя (адрес), так и значение, расположенное по этому указателю. В последнем случае следует использовать операцию *. Отметим, что компилятор Visual C++ отслеживает некорректные присваивания -указателю значения и наоборот - и выдает предупреждение о различных уровнях адресации (different level of indirection).

Следующая схема иллюстрирует соотношение указателя и значения.

Объявление и инициализация

 

char A

 

char B

 

char *pA

 

char *pB

 

 

Адреса ячеек памяти

1000

1001

2000

2020

 

Операции:

Содержание ячеек:

 

A='G';

G

 

pA=&A;

1000

 

B=*A;

G

 

*A='U'

U

 

pB=pA;

1000

 

pB=&A:

 

 

 

 

 

 

 

1000

 

Указатели на массивы

Указатели как и массивы содержат адрес. Указателю может быть присвоен адрес первого элемента массива. Такой указатель иногда называют указателем на массив. Отметим, что обратное неверно и адресу массива нельзя присвоить значение указателя.

Пример:

int iArray[20];

int* pA;

pA=iArray;

// или

pA=&iArray[0];

Указатели на указатели

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

// Две звездочки перед именем переменной определяют указатель на указатель тип **имя_указателя_на_указатель;

Отметим, что можно объявить указатель на указатели. Тогда уровнем вложенности указателей будет служить число звездочек перед именем переменной. Каждая звездочка интерпретируется как "указывает на".

Для получения значения по указателю на указатели перед именем указателя надо записать количество звездочек, равное уровню вложенности указателя.

Пример:

int iVar, jVar;

int* pV=&iVar; // pV - это адрес, a *pV - значение

int** ppV=& pV;

int*** pppV=& ppV;

iVar=33; // или **ppV=33;

jVar=*pV;

// или

jVar=**ppV;

// или

jVar=***pppV;

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

Над указателями можно выполнять операции сложения и вычитания. Для этого указатель первоначально должен быть инициализирован.

При увеличении значения указателя на единицу (pVar++;) значение адреса, хранимое в указателе, будет изменено в зависимости от типа указателя: так, для указателя на переменную типа int значение указателя будет реально увеличено на 4 (количество байт, выделяемых под тип int), а для указателя на переменную типа double адрес увеличится на 8 (количество байт, выделяемых под тип double).

Пример:

int iVar;

int* pV=&iVar;

int* pS=&iVar;

pV++;

// рV-pS будет равно 4

Операции инкремента (++) и декремента (--) указателя можно выполнять как после операции присвоения (*pVar++=10;), так и до (*++pVar=10;). В последнем случае сначала будет увеличено значение указателя, а затем выполнено присвоение.

Выполнять вычитание корректно только над указателями одного типа. Результатом вычитания является целое число, указывающее разность адресов памяти.

Над указателями одного типа можно выполнять операции сравнения. Результатом операции будет логическое значение.

Отметим, что, так же как и при работе с массивами, компилятор Visual C++ не выполняет для указателей проверку на предельные значения.

Соседние файлы в папке VC++Баженова