- •Лабораторная работа № 12
- •Операторы для работы с указателями
- •Выражения с указателями
- •Присваивание указателей
- •Арифметические действия с указателями
- •Сравнение указателей
- •Указатели и массивы
- •Указатели на многомерные массивы
- •Создание передачи по ссылке
- •Передача массивов в функции
- •Методические указания
- •Варианты заданий
Указатели на многомерные массивы
Многомерный массив в языке С – это массив массивов, т. е. Массив, элементами которого являются массивы. Например, трехмерный массив есть массив, элементы которого двухмерные массивы
int arr[L][M][N];
Массив arr состоит из L элементов. Каждый элемент – двухмерный массив размерностью M N. В памяти массив arr расположен следующим образом:
. . . |
Первый массив M N |
Второй массив M N |
. . . |
L - й массив M N |
. . . |
Младший
адрес Старший адрес
Каждый массив M N в памяти располагается по строкам. Например, i-й массив M N трехмерного массива arr представляется следующим образом:
. . . |
Первый массив из N элем-тов |
Второй массив из N элем-тов |
. . . |
M - й массив из N элем-тов |
. . . |
Рассмотрим, как осуществлять доступ к элементам многомерного массива через указатель. Сделаем это на примере массива arr.
Объявим указатель и свяжем его с массивом arr
int *ptr;
ptr = &arr[0][0][0];
Необходимо получить доступ к элементу arr[i][j][k], или к k-му элементу j-й строки i-го массива M N массива arr. Последовательно это вычисляется так:
адрес первого массива M N в массиве arr ptr
адрес i-го массива M N в массиве arr ptr + i*(M*N)
адрес j-й строки i-го массива M N ptr + i*(M*N) + j*N
в массиве arr
адрес k-го элемента j-й строки i-го массива ptr + i*(M*N) + j*N + k
M N в массиве arr
k-й элемент j-й строки i-го массива (ptr + i*(M*N) + j*N + k)
M N в массиве arr
Пример.
/* Функция поиска минимального элемента в трехмерном массиве. В функцию
передается адрес начала массива и размеры массива. Возвращается указатель
на структуру, содержащую индекс минимального элемента */
struct INDEX { /* определение структуры INDEX */
int i, j, k;
} index;
struct INDEX *find (int *ptr, int L, int M, int N0
{
int min;
int i, j, k, ind;
min = *ptr;
index.i = index.j = index.k = 0;
for (i = 0; i < L; i++)
for (j = 0; j < M; j++)
for (k =0; k < N; k++) {
ind = i*(M*N) + j*N + k;
if (min > *(ptr + ind)) {
min = *(ptr + ind);
index.i = i;
index.j = j;
index.k = k;
}
}
return &index;
}
Создание передачи по ссылке
Хотя, как правило, передача параметров в функцию в С происходит по значению, можно передать параметры по ссылке. Поскольку в данном случае происходит передача адреса аргумента, возможно изменение значения аргумента, находящегося вне функции.
Указатели передаются в функцию как обычные значения. Конечно, необходимо объявлять параметры типа указатель. Ниже приведена функция swap(), обменивающая значение двух целочисленных аргументов:
void swap (int *x, int *y)
{
int temp;
temp = *x /* сохранение значения по адресу х */
*x = *y; /* помещение у в х */
*y = temp; /* помещение х в у */
}
Оператор * используется для доступа к переменным, на которые указывают операнды. Следовательно, содержимое переменных, используемых при вызове функции, обменивается.
Важно помнить, что функция swap() (или любая другая функция, использующая указатели на параметры) должна вызываться с адресами аргументов. Следующая программа демонстрирует правильное использование функции swap() :
#include <stdio.h>
void swap (int *x, int *y);
int main(void)
{
int x, y;
x = 10;
y = 20;
swap(&x, &y);
printf(“%d %d”, x, y);
return 0;
}
