Между указателями и массивами существует тесная связь. Любое действие, выполняемое индексированием массива, может быть реализовано с помощью указателей, причем последний вариант более быстр и объектный код более компактен, однако такая реализация требует навыка и воспринимается хуже.
Если имеется определение вида short a[10], то упоминание имени a в про-грамме означает ссылку (адрес) на элемент массива a[0], т.е. на начальный адрес массива. Пусть имеем определение short *pa; тогда запись pa=&a[0] эквивалентна записи pa=a.
Над указателями можно производить любые действия, лишь бы они имели смысл.
Пример.
short a[10], *pa;
pa=a;
Выражение pa+5 определяет адрес 5 элемента массива a, т.е. это выражение задает смещение в 10 байтов от начала массива; выражение pa+i - адрес i-го элемента массива a. Отсюда следует, что запись *(pa+i) эквивалентна записи *(a+i), а она эквивалентна в свою очередь записи a[ i ]. Аналогично b[ i ][ j ] эквивалентно *(*(b+i)+ j).
Вывод. Любое обращение к элементу массива можно записать как ссылку и смещение относительно начального адреса массива.
Между использованием массивов и указателей есть следующие отличия:
- определение массива вызывает выделение памяти под все элементы массива, а определение указателя – выделение памяти только под него;
- имя массива является указателем – константой, т.е. его значение изменить нельзя, а значение указателя можно.
Пример. Сортировка массива с помощью индексирования и указателей.
void sort(double zap[ ], short n){
double buf;
short i, j, min_ind;
for(i=0; i<n-1; i++){
buf=zap[ i ];
min_ind=i;
for(j=i+1; j<n; j++){
if(buf>zap[ j ]){
buf=zap[ j ];
min_ind=j;
}
}
zap[min_ind]=zap[ i ];
zap[ i ]=buf;
}
} /* End sort */
void sort(double *zap, short n){
double buf;
short i, j, min_ind;
for(i=0; i<n-1; i++){
buf=*(zap + i);
min_ind=i;
for(j=i+1; j<n; j++){
if(buf>*(zap + j)){
buf=*(zap + j);
min_ind=j;
}
}
*(zap + min_ind)=*(zap + i);
*(zap + i)=buf;
}
} /* End sort */
Для многомерных массивов запись x[ i ] означает адрес i-го подмассива (сечения). При n=2 запись x[ i ] эквивалентна записи &x[i][0].
Пример применения.
double x[10][10];
................
sort(x[ i ],10); // Обращение к функции сортировки элементов i-й строки