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

39. Указатели. Связь между указателями и массивами.

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

Переменную, являющуюся указателем, нужно соответствующим образом объявить. Объявление указателя состоит из имени базового типа, символа * и имени переменной. Общая форма объявления указателя следующая:

тип *имя;

Базовый тип указателя определяет тип объекта, на который указатель будет ссылаться.

После объявления нестатического локального указателя до первого присвоения он содержит неопределенное значение. Указатель, не ссылающийся в текущий момент времени должным образом на конкретный объект, должен содержать нулевое значение. Нуль используется, потому что С гарантирует отсутствие чего-либо по нулевому адресу. Следовательно, если указатель равен нулю, то это значит, во-первых, что он ни на что не ссылается, а во-вторых – что его сейчас нельзя использовать.

Указателю можно задавать нулевое значение, присвоив ему 0. Например, следующий оператор инициализирует p нулем:

char*p=0;

Дополнительно к этому во многих заголовочных файлах языка С, например, в <stdio.h> определен макросNULL, являющийся нулевой указательной константой. Поэтому в программах на С часто можно увидеть следующее присваивание:

p=NULL;

Однако равенство указателя нулю не делает его абсолютно «безопасным». Использование нуля в качестве признака неподготовленности указателя – это только соглашение программистов, но не правило языка С.

Указатель на 1-й элемент массива можно создать путем присваивания ему имени массива без индекса. Например, если есть объявление

intsample[10];

то в качестве указателя на 1-й элемент массива можно использовать имя sample. В следующем фрагменте программы адрес 1-го элемента массива sample присваивается указателю p:

int *p;

int sample[10];

p=sample;

В обеих переменных (p и sample) хранится адрес 1-го элемента, отличаются эти переменные только тем, что значение sample в программе изменить нельзя. Адрес первого элемента можно также получить, используя оператор получения адреса &. Например, выражение sample и &sample[0] имеют одно и то же значение.

Указатели и массивы тесно связаны друг с другом. Имя массива без индекса – это указатель на первый элемент массива. Рассмотрим следующий массив:

charp[10];

Следующие два выражения идентичны:

P

&p

Выражение p==&p[0] принимает значение истина, потому что адрес 1-го элемента массива – это то же самое, что и адрес массива.

Имя массива без индекса представляет собой указатель. И наоборот, указатель можно индексировать как массив.

int*p,i[10];

p=i;

p[5]=100; // в присвоении используется индекс

*(p+5)=100; //в присвоении используется адресная арифметика.

Оба оператора присваивания заносят число 100 в 6-ой элемент массива i. Первый из них индексирует указатель p, во втором применяются правила адресной арифметики. В обоих случаях получается один и тот же результат.

Можно также индексировать указатели на многомерные массивы. Например, если а – это указатель на двухмерный массив целых размерностью 10х10, то следующие два выражения эквиваленты:

A

&a[0][0]