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

6.1. Краткие теоретические сведения Особенности применения указателей

Обращение к объектам любого типа в языке C может проводиться по имени, как мы до сих пор делали, и по указателю(косвенная адресация).

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

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

тип*ID указателя;

Перед использованием указатель должен быть инициирован либо конкретным адресом, либо значением NULL(0) – отсутствие указателя.

С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес», а операция разадресации * – «значение, расположенное по адресу», например:

int x, *y; // х– переменная типаint,у– указатель типаint

y = &x; // y– адрес переменнойx

*y = 1; // по адресу yзаписать 1, в результатеx= 1

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

Операции сложения, вычитания и сравнения (больше/меньше) имеют смысл только для последовательно расположенных данных – массивов. Операции сравнения «==» и «!=» имеют смысл для любых указателей, т.е. если два указателя равны между собой, то они указывают на одну и ту же переменную.

Связь указателей с массивами

Указатели и массивы тесно связаны между собой. Идентификатор массива является указателем на его первый элемент, т.е. для массива int a[10], выраженияaиa[0] имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива – это адрес начала размещения его элементов в ОП.

Пусть объявлены – массив из 10 элементов и указатель типа double:

doublea[10], *p;

если p=a; (установить указательpна начало массиваa), то следующие обращения:a[i] , *(a+i) и *(p+i) эквивалентны, т.е. для любых указателей можно использовать две эквивалентные формы доступа к элементам массива:a[i] и *(a+i). Очевидна эквивалентность следующих выражений:

&a[0]&(*p)p

Декларация многомерного массива:

типID[размер1][размер2]…[размерN];

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

inta[2][3] = {{0,1,2},{3,4,5}};

в ОП будет размещен следующим образом:

a[0][0]=0,a[0][1]=1,a[0][2]=2, a[1][0]=3,a[1][1]=4,a[1][2]=5.

Если в списке инициализаторов данных не хватает, то соответствующему элементу присваивается значение 0.

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

Связь указателей и массивов с одним измерением справедливо и для массивов с бóльшим числом измерений.

Если рассматривать предыдущий массив (inta[2][3];) как массив двух массивов размерностью по три элемента каждый, то обращение к элементуа[i][j] соответствует эквива­лентное выражение *(*(а+i)+j), а объявление этого массива с использованием указателей будет иметь вид

int**а;

Таким образом, имя двухмерного массива – IDуказателя на указатель.