Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

23.2. Передача двумерных массивов в функции

Вместо одномерного массива функции передается указатель на его первый элемент. Точно так же не передается функции и двумерный массив. Массив массивов (т.е. двумерный массив в языке С) при передаче в функцию превращается в указатель на массив, а не в указатель на указатель. В функцию передается указатель на массив, число элементов которого равно длине строки двумерного массива.

Следующее описание является неверным:

func(int **mas) { // ошибка!!!

...

}

Если в функцию передается двумерный массив:

int mas[N][M];

func(mas);

описание функции должно соответствовать

func(int mas[][M]) {

...

}

или

func(int (*pmas)[M]) { // pmas - указатель на массив из M элементов

...

}

Скобки (*pmas) в объявлении обязательны, т.к. int *pmas[M] – это массив указателей на int, а не указатель на массив.

Обратить внимание! Так как функция не выделяет место для массива, нет необходимости знать его точный размер. Поэтому количество строк N может быть опущено. В то же время количество элементов в строке (количество столбцов M) опускать нельзя, т.к. «форма» массива (количество столбцов) используется для вычисления смещения элемента относительно начала массива. Поэтому количество столбцов (вторую размерность M) надо указывать обязательно.

Задача. Разработать функции для печати массива из 10 столбцов и замены знака у всех элементов массива с 5-ю столбцами.

void print10(int mas[][10], int n) {

int i, j;

for (i=0; i<n; i++) {

for (j=0; j<10; j++)

printf("%5d ", mas[i][j]);

printf("\n");

}

}

void negative5(int (*mas)[5], int n, int m) {

int i, j;

for (i=0; i<n; i++)

for (j=0; j<m; j++)

mas[i][j] = - mas[i][j];

}

void main(void) {

int a[10][10],

b[10][5] = {{1, 2, 3, 4},

{5, 6, 7, 8},

{9, 9, 9, 9}};

int i, j, n=5;

for (i=0; i<n; i++)

for (j=0; j<10; j++)

scanf("%d", &a[i][j]);

print10(a,n);

negative5(b,3,4);

for (i=0; i<3; i++) {

for (j=0; j<4; j++)

printf("%5d ", b[i][j]);

printf("\n");

}

}

Обратить внимание! У двумерных (многомерных) массивов есть один неприятный недостаток при передаче их в функцию – для обработки массива с пятью столбцами нужно писать одну функцию, а для массива с десятью столбцами – другую!

При передаче функции двумерного массива как фактического параметра необходимо обязательно указывать количество столбцов. Однако, если работа с двумерным массивом не требует доступа к элементам посредством конкретного указания строк и столбцов, то функция может воспринимать многомерный массив как одномерный, хотя в качестве фактического параметра ей передается многомерный массив.

long sum(int m[], int n) {

long s = 0;

int i;

for (i = 0; i < n; i++)

s += m[i]; // s += *(m+i);

return s;

}

void main(void) {

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int b[2][10] = {{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},

{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}};

int c[5][10] = {{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},

{11, 12, 13, 14, 15, 16, 17, 18, 19, 20},

{21, 22, 23, 24, 25, 26, 27, 28, 29, 30}};

printf("Сумма массива a = %d\n", sum(a, 10));

printf("Сумма массива b = %d\n", sum((int *)b, 20));

printf("Сумма массива c = %d\n", sum((int *)c, 30));

}

Функция sum() работает с двумерными массивами так же, как и с одномерными массивами. Так работать с двумерным массивом позволяет способ хранения в памяти многомерных массивов в языке С. Правда, есть одно ограничение – реальное количество элементов в строке такого массива должно строго совпадать со второй размерностью массива, а вот количество строк в таком массиве может быть любым.