Рубрики

Как передать 2D массив в качестве параметра в C?

Этот пост является расширением Как динамически разместить 2D-массив в C?

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

1) Когда оба измерения доступны глобально (в виде макроса или глобальной константы).

#include <stdio.h>

const int M = 3;

const int N = 3;

  

void print(int arr[M][N])

{

    int i, j;

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

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

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

}

  

int main()

{

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

    print(arr);

    return 0;

}

Выход:

1 2 3 4 5 6 7 8 9

2) Когда в глобальном масштабе доступно только второе измерение (в виде макроса или глобальной константы).

#include <stdio.h>

const int N = 3;

  

void print(int arr[][N], int m)

{

    int i, j;

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

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

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

}

  

int main()

{

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

    print(arr, 3);

    return 0;

}

Выход:

1 2 3 4 5 6 7 8 9

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

3) Если компилятор совместим с C99
От C99, поддерживает C языка переменного размера массивов должны быть переданы , просто указав размеры переменных (см это для примера запуска)

// Следующая программа работает, только если ваш компилятор совместим с C99.
#include <stdio.h>

  
// n должен быть передан перед 2D-массивом

void print(int m, int n, int arr[][n])

{

    int i, j;

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

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

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

}

  

int main()

{

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

    int m = 3, n = 3;

    print(m, n, arr);

    return 0;

}

Вывод на C99-совместимый компилятор:

1 2 3 4 5 6 7 8 9

Если компилятор не совместим с C99, то мы можем использовать один из следующих методов для передачи двумерного массива переменного размера.

4) Использование одного указателя
В этом методе мы должны типизировать 2D-массив при переходе к функции.

#include <stdio.h>

void print(int *arr, int m, int n)

{

    int i, j;

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

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

        printf("%d ", *((arr+i*n) + j));

}

  

int main()

{

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

    int m = 3, n = 3;

  

    // Мы также можем использовать «print (& arr [0] [0], m, n);»

    print((int *)arr, m, n);

    return 0;

}

Выход:

1 2 3 4 5 6 7 8 9

Ссылки:
http://www.eskimo.com/~scs/cclass/int/sx9a.html

Эта статья предоставлена Абхай Рати . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Как передать 2D массив в качестве параметра в C?

0.00 (0%) 0 votes