49 함수에서 배열 매개변수 사용하기

함수에서 배열을 매개변수로 사용하면 연속된 값을 전달할 수 있고, 전달한 배열의 요소를 함수 안에서 변경할 수 있습니다.

이번에는 1차원 배열과 2차원 배열을 매개변수로 사용하는 방법을 알아보겠습니다.참고로 이 부분은 문법이 복잡하고 내용이 다소 어려울 수 있습니다.

49.1 배열 매개변수 사용하기

함수에서 배열을 매개변수로 사용하려면 ( ) (괄호) 안에서 매개변수 이름 뒤에 [ ] (대괄호)를 붙이거나 매개변수를 포인터로 지정해줍니다.

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

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

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

parameter_array.c

#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;
}

실행 결과

1 2 3 4 5 6 7 8 9 10

함수에서 배열을 매개변수로 사용할 때는 매개변수 이름 뒤에 []만 붙이면 됩니다(대괄호 안에 크기를 지정하더라도 무시됩니다). 즉, arr[]은 배열의 메모리 주소를 담고 있는 포인터이며 배열의 실제 크기를 알 수 없으므로 다른 매개변수를 통해 배열의 크기를 받아야 합니다.

void printArray(int arr[], int count)    // 배열의 포인터와 요소의 개수를 받음

printArray를 사용할 때는 배열과 요소의 개수를 넣습니다. 이때 요소의 개수를 구하는 방법은 sizeof(배열) / sizeof(자료형)입니다. 배열의 크기인 10을 그대로 넣어도 되지만 sizeof로 크기를 구하면 배열의 크기가 바뀌었을 때 코드를 수정하지 않아도 됩니다.

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

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

printArray 안에서는 매개변수 arrcount를 사용하여 배열의 요소를 출력할 수 있습니다.

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

    printf("\n");
}

매개변수를 arr[]과 같이 지정했다면 arr은 포인터입니다. 따라서 다음과 같이 함수 안에서 매개변수로 받은 배열의 요소를 변경하면 함수 바깥에 있는 배열의 요소가 바뀌게 됩니다.

parameter_array_set_element.c

#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;
}

실행 결과

300

setElement 함수 안에서 arr[2]에 300을 저장했습니다. 그다음에 main 함수에서 numArr[2]를 출력해보면 300이 나옵니다. 즉, 배열의 메모리 주소를 전달했기 때문에 실제로는 바깥에 있는 배열의 요소가 바뀌었습니다.

그림 49‑1 매개변수로 받은 배열의 요소를 변경

이번에는 대괄호 대신 매개변수를 포인터로 지정해보겠습니다.

parameter_pointer.c

#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;
}

실행 결과

1 2 3 4 5 6 7 8 9 10

1차원 배열은 int *arr과 같이 int형 포인터로 받을 수 있습니다. 물론 포인터로는 배열의 크기를 알 수 없으므로 다른 매개변수를 통해 배열의 크기를 받습니다.

void printArray(int *arr, int count)    // 매개변수를 포인터로 지정하여 배열을 받음

여기서도 arr은 포인터이므로 함수 안에서 배열의 요소를 변경하면 함수 바깥에 있는 배열의 요소가 바뀌게 됩니다. 이러한 특성을 이용하여 이번에는 배열에서 특정 요소의 값을 서로 바꿔보겠습니다.

parameter_array_swap_element.c

#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 1

다음과 같이 배열의 메모리에 직접 접근하여 값을 바꾸게 되므로 함수 바깥에서도 바뀐 값이 계속 유지됩니다.

그림 49‑2 매개변수로 받은 배열의 요소 변경
참고 | 복합 리터럴 사용하기(배열)

함수에 배열을 넘겨줄 때 복합 리터럴을 사용하면 배열을 따로 선언하지 않아도 됩니다(복합 리터럴은 C99에 추가된 기능).

  • (자료형[]) { 값1, 값2, 값3 }
  • (자료형[크기]) { 값1, 값2, 값3 }

compound_literal_array.c

#include <stdio.h>

void printArray(int arr[], int count)
{
    for (int i = 0; i < count; i++)
    {
        printf("%d ", arr[i]);
    }

    printf("\n");
}

int main()
{
    // 복합 리터럴 방식으로 배열을 넘겨줌
    printArray((int[]) { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, 10);

    return 0;
}
참고 | 함수의 배열 매개변수에서 요소의 최소 개수 지정하기

함수의 배열 매개변수에 static과 숫자를 사용하면 요소의 최소 개수를 지정할 수 있습니다. 이렇게 하면 매개변수로 들어온 배열의 요소 개수가 지정된 개수보다 작을 때 경고가 발생합니다. 단, VS2015에서는 사용할 수 없으며 GCC, Clang에서만 지원합니다.

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

static_array_declarator.c

#include <stdio.h>

void printArray(int arr[static 5], int count)    // 배열 요소의 최소 개수를 5개로 지정
{
    for (int i = 0; i < count; i++)
    {
        printf("%d ", arr[i]);
    }

    printf("\n");
}

int main()
{
    int numArr1[5] = { 1, 2, 3, 4, 5 };

    // 요소 개수가 5개이므로 OK
    printArray(numArr1, sizeof(numArr1) / sizeof(int));

    int numArr2[3] = { 1, 2, 3 };

    // 요소 개수가 3개이므로 경고
    printArray(numArr2, sizeof(numArr1) / sizeof(int));

    return 0;
}