Skip to content

57. 함수 배열 매개변수


1. 키워드

  • 배열 매개변수
  • 복합 리터럴


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

  • 함수에서 배열을 매개변수로 사용하면 연속된 값을 전달할 수 있고, 전달한 배열의 요소를 함수 안에서 변경할 수 있다.
  • 이번에는 1차원 배열과 2차원 배열을 매개변수로 사용하는 방법을 알아보자.


3. 배열 매개변수 사용하기

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


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

반환값자료형 함수이름(자료형 *매개변수)
{
}
#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은 포인터이다.
  • 따라서 다음과 같이 함수 안에서 매개변수로 받은 배열의 요소를 변경하면 함수 바깥에 있는 배열의 요소가 바뀌게 된다.


#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]); // setElement에서 변경한 값이 출력됨

    return 0;
}

// 300


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


001


  • 이번에는 [] 대신 매개변수를 포인터로 지정해 보자.


#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은 포인터이므로 함수 안에서 배열의 요소를 변경하면 함수 바깥에 있는 배열의 요소가 바뀌게 된다.
  • 이러한 특성을 이용하여 이번에는 배열에서 특정 요소의 값을 서로 바꿔보자.


#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]); // swapElement에 의해서 배열 요소의 값이 서로 바뀜

    return 0;
}

// 2 1


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

002


복합 리터럴 사용하기(배열)

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


(자료형[]) { 값1, 값2, 값3 }
(자료형[크기]) { 값1, 값2, 값3 }
#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;
}

// 1 2 3 4 5 6 7 8 9 10


함수의 배열 매개변수에서 요소의 최소 개수 지정하기

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


반환값자료형 함수이름(자료형 매개변수[static 최소개수])
{
}
#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(numArr2) / sizeof(int));

    return 0;
}


4. 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); // 2차원 배열의 열 크기를 구할 때는
                                               // 행 한 줄을 요소의 크기로 나눠줌

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

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

    return 0;
}

// 1 2 3 4 5
// 6 7 8 9 10


  • 함수에서 2차원 배열을 매개변수로 사용할 때는 매개변수 이름 뒤에 []를 두 개 붙이고 두 번째 []에는 배열의 열 크기를 지정해야 한다.
  • 이때 첫 번째 [] 안에는 행 크기를 지정하더라도 무시된다.
  • 즉, arr[][5]는 2차원 배열의 메모리 주소를 담고 있는 포인터이며 2차원 배열의 실제 크기를 알 수 없으므로 다른 매개변수로 배열의 열, 행 크기를 받아야 한다.


void print2DArray(int arr[][5], int col, int row) // 2차원 배열의 포인터와 열, 행 크기를 받음


  • print2DArray를 사용할 때는 2차원 배열과 열, 행 크기를 넣는다.
  • 여기서 열 크기를 구할 때는 행 한 줄을 요소(자료형)의 크기로 나누면 되고, 행 크기를 구할 때는 배열이 차지하는 공간을 행 한 줄의 크기로 나눠주면 된다.


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

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

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

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


  • print2DArray 안에서는 매개변수 arrcol, row를 사용하여 2차원 배열의 요소를 출력할 수 있다.


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");
    }
}


  • arr도 포인터이므로 함수 안에서 2차원 배열의 요소를 변경하면 함수 바깥에 있는 2차원 배열의 요소가 바뀐다.


  • 2차원 배열을 매개변수로 사용할 때는 포인터와 []를 사용할 수도 있다.


#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); // 2차원 배열의 열 크기를 구할 때는
                                               // 행 한 줄을 요소의 크기로 나눠줌

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

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

    return 0;
}

// 1 2 3 4 5
// 6 7 8 9 10


  • int (*arr)[5]와 같이 int 타입 배열의 포인터로 지정하면 2차원 배열을 매개변수로 사용할 수 있다.
  • 또한, []를 두 개 붙일 때와 마찬가지로 [] 안에는 2차원 배열의 열 크기를 지정한다.
  • 여기서 주의할 점은 (*arr)[5]와 같이 포인터를 ()로 묶어서 배열의 포인터라는 점을 명확하게 표시해야 한다.
  • 그리고 포인터로는 2차원 배열의 크기를 알 수 없으므로 다른 매개변수를 통해 배열의 열, 행 크기를 받는다.


void print2DArray(int (*arr)[5], int col, int row) // 매개변수를 포인터로 만든 뒤 가로 크기 지정


복합 리터럴 사용하기(2차원 배열)

  • 복합 리터럴을 사용하면 2차원 배열도 함수에 넘겨줄 수 있다.


(자료형)[][가로크기] { { 값1, 값2, 값3 }, { 값4, 값5, 값6 } }
(자료형)[세로크기][가로크기] { { 값1, 값2, 값3 }, { 값4, 값5, 값6 } }
#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()
{
    // 복합 리터럴 방식으로 2차원 배열을 넘겨줌
    print2DArray((int[2][5]){{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}, 5, 2);

    return 0;
}

// 1 2 3 4 5
// 6 7 8 9 10

References