Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab12.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
91.14 Кб
Скачать
    1. Указатели на многомерные массивы

Многомерный массив в языке С – это массив массивов, т. е. Массив, элементами которого являются массивы. Например, трехмерный массив есть массив, элементы которого двухмерные массивы

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;

}

    1. Создание передачи по ссылке

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

Указатели передаются в функцию как обычные значения. Конечно, необходимо объявлять параметры типа указатель. Ниже приведена функция 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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]