[C언어 스터디 - 13] 배열을 입력으로 이용하는 함수 (function using array as input)

2020. 7. 3. 11:0003. Resources/C, C++

728x90
반응형

C언어 함수 정리

참고 문헌 (Ch 64): https://dojang.io/mod/page/view.php?id=562

배열 매개변수 사용하기

함수의 입력(매개변수)으로 배열을 사용하기 위해서는 입력(매개변수) 이름 뒤에 []를 붙이거나 매개변수를 포인터로 지정해주면 된다.

반환값자료형 함수이름(자료형 매개변수[])
{
}

반환값자료형 함수이름(자료형 *매개변수)
{
}

예시

#include <stdio.h>

void printArray(int arr[], int count)    // 배열의 포인터와 요소의 개수를 받음 
{
    for (int i = 0; i < count; i++)
    {
        printf("%d ", arr[i]);
    }

    printf("\n");
}

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

    printArray(numArr, sizeof(numArr) / sizeof(int));    // 배열과 요소의 개수를 넣음

    return 0;
}

입력으로 들어오는 arr[]은 배열의 메모리 주소를 담고있는 포인터이기 때문에, 배열의 크기를 입력으로 넣어 주어야 한다.
특히 요소의 개수를 넣어줄 때, 배열의 크기 변화에 대응하기 위해서 sizeof 를 이용해야한다.
또한 arr[]로 입력(매개변수)를 지정한 경우 이는 포인터이기 때문에 배열의 요소를 변경하면 함수 바깥에 있는 배열의 값도 바뀌게 된다.

#include <stdio.h>

void setElement(int arr[])    // 배열의 포인터를 받음
{
    arr[2] = 300;    // 매개변수로 받은 배열의 요소를 변경
}

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

    setElement(numArr);    // 배열을 넣어줌

    printf("%d\n", numArr[2]);    // 300: setElement에서 변경한 값이 출력됨

    return 0;
}

매개변수를 포인터로 지정하면 아래와 같다.

#include <stdio.h>

void printArray(int *arr, int count)    // 매개변수를 포인터로 지정하여 배열을 받음
{
    for (int i = 0; i < count; i++)
    {
        printf("%d ", arr[i]);
    }

    printf("\n");
}

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

    printArray(numArr, sizeof(numArr) / sizeof(int));    // 배열과 요소의 개수를 넣음

    return 0;
}

이를 이용하면 함수 안에서 배열의 요소를 바꾸는 함수를 작성할 수 있다.

#include <stdio.h>

void swapElement(int arr[], int first, int second)    // 배열의 포인터와 인덱스를 받음
{
    int temp;

    temp = arr[first];
    arr[first] = arr[second];
    arr[second] = temp;
}

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

    swapElement(numArr, 0, 1);    // 배열과 값을 서로 바꿀 인덱스를 넣음

    printf("%d %d\n", numArr[0], numArr[1]); // 2 1: swapElement에 의해서 배열 요소의 값이 서로 바뀜
    return 0;
}

2차원 배열 매개변수 사용하기

함수에서 2차원 배열을 매개변수로 사용하려면 매개변수 이름 뒤에 [][가로 크기] 를 붙이고 가로 크기를 지정하거나, 괄호로 묶은 포인터 뒤에 [가로 크기]를 붙인다.

반환값자료형 함수이름(자료형 매개변수[][가로크기])
{
}

반환값자료형 함수이름(자료형 (*매개변수)[가로크기])
{
}

예시 (두 개의 대괄호를 이용한 방법)

#include <stdio.h>

//                          ↓ 배열의 가로 크기 지정
void print2DArray(int arr[][5], int col, int row)    // 2차원 배열의 포인터와 가로, 세로 크기를 받음
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d ", arr[i][j]);
        }

        printf("\n");
    }
}

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

    int col = sizeof(numArr[0]) / sizeof(int);      // 5: 2차원 배열의 가로 크기를 구할 때는 
                                                    // 가로 한 줄을 요소의 크기로 나눠줌

    int row = sizeof(numArr) / sizeof(numArr[0]);   // 2: 2차원 배열의 세로 크기를 구할 때는 
                                       // 배열이 차지하는 공간을 가로 한 줄의 크기로 나눠줌

    print2DArray(numArr, col, row);    // 2차원 배열과 가로, 세로 크기를 넣음

    return 0;
}

예시 (포인터와 대괄호를 이용한 방법)

#include <stdio.h>

void print2DArray(int (*arr)[5], int col, int row)   // 매개변수를 포인터로 만든 뒤 가로 크기 지정
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d ", arr[i][j]);
        }

        printf("\n");
    }
}

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

    int col = sizeof(numArr[0]) / sizeof(int);      // 5: 2차원 배열의 가로 크기를 구할 때는 
                                                    // 가로 한 줄을 요소의 크기로 나눠줌

    int row = sizeof(numArr) / sizeof(numArr[0]);    // 2: 2차원 배열의 세로 크기를 구할 때는 
                                       // 배열이 차지하는 공간을 가로 한 줄의 크기로 나눠줌

    print2DArray(numArr, col, row);    // 2차원 배열과 가로, 세로 크기를 넣음

    return 0;
}
반응형