Как передать 2-мерный массив в качестве аргумента функции в C? - PullRequest
0 голосов
/ 16 сентября 2018

Код:

#include <stdio.h>

char* input(char* arr,int N, int M){
    int i, j;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            scanf("%d",&arr[i][j]); 
        }   
    }
    return arr;
}

int main() {
    int i,N,M;    
    scanf("%d%d",&N,&M);
    char arr[N][M];
    arr=input(arr,N,M);
    return 0;
}

Пояснение:

Выше приведена простая программа, в которой пользователь вводит данные в двумерный массив.

Здесь я попытался присвоить значение указателю arr (который указывает на базовый адрес); адрес, который мы получаем из функции ввода того же массива, заполненного элементами сейчас. Мы передали указатель на массив во входной функции в качестве одного аргумента, а размеры массива - в качестве другого.

В основном проблема, с которой здесь сталкиваются, связана с указателями и их применением в массивах. Но я не могу понять, как я буду вносить изменения

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Существует два способа передачи двумерного массива в качестве аргумента функции.

char *input (char [][m]arr, int n, int m)

Вы будете читать / записывать значения так, как вы делаете это в своем коде. Помните, что эта функция введена в C99 и не будет компилироваться со старыми компиляторами.

Другой вариант - передать его как указатель:

char *input (char *arr, int n, int m)

Здесь вы могли бы прочитать или написать массив следующим образом:

int i, j;
for(i=0; i<N; i++){
    for(j=0; j<M; j++){
        *(arr + i * n + j) = 'a';
        /* OR you can also do this */
        arr[i *n + j] = 'a';
    }   
}

Многомерные массивы в C хранятся в памяти построчно. Таким образом, если вы выделите массив 3 x 2, у вас будет 3 строки, каждая из которых имеет 2 столбца. Но расположение памяти будет:

0, 1 => row1

2, 3 => row2

4, 5 => row3

Здесь 0,1,2,3,4,5 - смежные индексы массива. Чтобы получить доступ ко 2-му столбцу 3-й строки с указателем arr на базовый адрес массива, вам нужно будет найти адрес правильной ячейки в массиве.

Мы знаем, что в каждой строке 2 ячейки, поэтому, чтобы перейти к 3-й строке, нам нужно добавить row_id * number_of_cols_per_row к базовому указателю. Итак, чтобы попасть в 3-й ряд, нам нужно сделать arr + 2 * 2. Как только мы окажемся в правильной строке, нам нужно добавить смещение столбца столбца, к которому мы хотим получить доступ. Итак, здесь мы хотим получить доступ ко второму столбцу, поэтому мы добавляем 1.

arr + 2 * 2 + 1

Но это будет адрес второго столбца третьего ряда. Чтобы написать здесь, нам нужно использовать оператор *:

*(arr + 2 * 2 + 1) = 'a';

Это именно то, что мы делаем в цикле.

Кроме того, в вашем коде вы вызываете scanf со спецификатором формата %d, который предназначен для целых чисел. Но вы сохраняете значение в массиве char. Это может быть потенциальной ошибкой, правильно использовать спецификатор %c.

0 голосов
/ 16 сентября 2018

Вот полное решение, которое работает:

#include <stdio.h>

void input(int N, int M, char arr[N][M]){
    int i, j;
    for(i=0; i<N; i++){
        for(j=0; j<M; j++){
            scanf("%c", &arr[i][j]);
        }
    }
}

int main() {
    int N, M;
    scanf("%d %d", &N, &M);
    char arr[N][M];
    input(N, M, arr);
    return 0;
}
0 голосов
/ 16 сентября 2018

Вы можете использовать шедевр двумерного массива в качестве аргумента или параметра, вы можете указать размер всех измерений при определении группы параметров в вызываемой функции, или вы можете опустить описание размера первого измерения, напримеркак:

void Func(int array[3][10]);
void Func(int array[][10]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...