Связь указателей и массивов
Идентификатор одномерного массива – это адрес памяти, начиная с которого он расположен, т.е. адрес его первого элемента. Таким образом, работа с массивами тесно взаимосвязана с применением указателей. Рассмотрим связь указателей с элементами одномерного массива на примере.
Пусть объявлены одномерный целочисленный массив a из 5 элементов и указатель p на целочисленные переменные:
int a[5]={1, 2, 3, 4, 5}, *p;
ID массива a является константным указателем на его начало, т.е. а = &a[0] – адрес начала массива. Расположение массива а в оперативной памяти, выделенной компилятором, может выглядеть следующим образом:
a[0] | a[1] | a[2] | a[3] | a[4] | – элементы массива; |
– значения элементов массива; | |||||
– символические адреса. |
Указатель а содержит адрес начала массива и в нашем примере равен 4000 (а = = 4000).
Если установить указатель р на объект а, т.е. присвоить переменной-указателю адрес первого элемента массива:
р = а;
что эквивалентно выражению р = &a[0]; то получим, что и р = 4000. Тогда с учетом адресной арифметики обращение к i-му элементу массива а может быть записано следующими выражениями:
а[i] ~ *(а+i) ~ *(р+i) ~ р[i] ,
приводящими к одинаковому результату.
Идентификаторы а и р – указатели, очевидно, что выражения а[i] и *(а+i) эквивалентны. Отсюда следует, что операция обращения к элементу массива по индексу применима и при его именовании переменной-указателем. Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: р[i] и *(р+i). Первая форма удобнее для читаемости текста, вторая – эффективнее по быстродействию программы.
Например, для получения значения 4-го элемента массива можно написать а[3] или *(а+3), результат будет один и тот же, а операции a[3] = 8 и *(р+3) = 8 дадут тождественный результат, т.к. р+3 = 4000+3*sizeof(int) = = 4000+3*2 = 4006, т.е. указатель р установлен на четвертый по счету элемент массива.
Очевидна и эквивалентность выражений:
– получение адреса начала массива в ОП:
&а[0] « &(*а) « а
– обращение к первому элементу массива:
*а « а[0]
Последнее утверждение объясняет правильность выражения для получения количества элементов массива:
int x[]={1, 2, 3, 4, 5, 6, 7};
Размер n должен быть целочисленной константой:
int n = sizeof(x) / sizeof(*x);
Дата добавления: 2015-09-11; просмотров: 626;