프로그래밍 언어/C

2차원 배열을 함수의 매개변수로 전달하기#1(c언어)

fladi 2021. 7. 3. 05:34
728x90

2차원 배열을 함수의 매개변수로 전달하려면 동적할당을 이용해야합니다~

예시문제를 보면서 살펴보도록 합시다!

 

이 문제에서는 c언어에서의 배열이 연속적으로 메모리에 저장된다는 성질을 이용합니다.

2차원배열이라고 해도 메모리에는 연속으로 저장되므로, 일단 함수 매개변수로 받을 때 1차원 배열의 포인터로 받습니다. 그리고 함수 안에서 각 행마다 int**타입을 가지는 배열에 담아줌으로써 2차원 배열로 이용할 수 있습니다!

 

이해를 돕기위한 그림/ 3행3열 2차원 배열 만들기

그림과 같이 일단 int*로 받고(포인터끼리는 형변환이 자유로우니까요!) 

int**로 각 행 시작에 해당하는 배열요소의 주소를 넣어주면 됩니다!

int** arr이 있다면 arr[0], arr[1], arr[2]에 각각 3개씩 담아주면 되는거죠.

 

 

문제: 2차원배열 값들 중 가장 큰 값 찾기

#include <stdio.h>
#include <stdlib.h>

먼저 malloc 동적할당을 사용하기 위한 stdlib 인클루드 해주고

 

int Find_2D_Max2(int* A, int row, int col)
{
    int** arr = malloc(sizeof(int*) * row);
    for (int i = 0; i < row; i++)
        arr[i] = A + col * i;

    int max = -1;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (max < arr[i][j])
                max = arr[i][j];
        }
    }
    return max;
}

요래요래 함수를 만들어줬습니다. 

저는 양의 정수에 해당하는 값만 넣을거라 max의 초기값은 -1로 설정해주었습니다.

값이 잘 나오는 걸 알 수 있습니다! 초록색 밑줄은 왜 생기는지 잘 모르겠네요..ㅜ

 

전체코드 첨부합니다!

#include <stdio.h>
#include <stdlib.h>

int Find_2D_Max2(int* A, int row, int col)
{
    int** arr = malloc(sizeof(int*) * row);
    for (int i = 0; i < row; i++)
        arr[i] = A + col * i;

    int max = -1;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (max < arr[i][j])
                max = arr[i][j];
        }
    }
    return max;
}

int main()
{
    int A[][5] = {
        {1,2,3,4,5},
        {6,7,8,9,0},
        {5,4,3,2,1},
        {10,9,8,7,6},
    };

    int max = Find_2D_Max2(A, 4, 5);
    printf("%d", max);

    return 0;
}

 

이 방법 말고도 malloc 2번하는 방법도 있습니다~

그냥 위 코드에서 함수의 첫 번째 for문에 malloc 한 번 더 해주면 됩니다.

엄청 쉽습니다. 저는 요 방법이 더 편하더라고요. 다음에 글 써야겠습니다

728x90