Применение указателей

Идентификатор массива – это адрес памяти, начиная с которого он расположен, т.е. адрес его первого элемента. Работа с массивами тесно связана с применением указателей.

Пусть объявлены массив a из 5 целочисленных элементов и указатель q на целочисленные переменные:

int a[5], *q;

ID массива a является константным указателем на его начало.

a

a[0] a[1] a[2] a[3] a[4]

Здесь приведено символическое изображение оперативной памяти, выделенной компилятором для объявленного целочисленного массива а[5]. Указатель а содержит адрес его начала в оперативной памяти (ОП), т.е. «символический адрес»=4000 (а=4000).

Если выполнена операция: q=а; - присваивание константы переменной, т.е. q=4000 (аналог: q=&a[0]), то с учетом адресной арифметики выражения а[i] и *(q+i) приводят к одинаковым результатам – обращению к i-му элементу массива.

Идентификаторы а и q - указатели, очевидно, что выражения а[i] и *(а+i) эквивалентны. Отсюда следует, что операция обращения к элементу массива по индексу применима и при его именовании переменной-указателем. Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: q[i] и *(q+i). Первая форма удобнее для читаемости текста, вторая - эффективнее по быстродействию программы.

Например, для получения значения 4-го элемента массива можно написать а[3] или *(а+3), результат будет один и тот же.

Очевидна эквивалентность выражений:

1) получение адреса начала массива в ОП:

&а[0] « &(*а) « а

2) обращение к первому элементу массива:

*а « а[0]

Последнее объясняет правильность выражения для получе­ния количества элементов массива с объявленной размерностью:

type x[100]; // Размерность должна быть константой

...

int n = sizeof(x) / sizeof(*x);

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

Объявление массива указателей на целые числа имеет вид:

int *a[10], y;

Теперь каждому из элементов массива можно присвоить адрес целочи­сленной переменной y, например: a[1]=&y;

Чтобы теперь найти значение переменной y через данный элемент массива а, необходимо записать *a[1].