C 배열 함수로 넘기기 - c baeyeol hamsulo neomgigi

배열을 매개변수로 하는 함수 선언 방법

배열을 함수의 매개변수로 사용하기 위해서는 다음과 같이 선언할 수 있습니다.

int sum (int arr[]); 
int sum (int *ptr);

하나는 일반적인 매개변수 선언과 같이 배열(arr[])로 선언하였고 다른 하나는 포인터 변수(*ptr)로 선언하였습니다. 

배열의 값을 함수의 매개변수로 사용하는 예제

#include<stdio.h>

void giveMeArray(int a);

int main()
{
    int myArray[] = { 2, 3, 4 };
    giveMeArray(myArray[2]);        //myArray[2]의 값 변수로 전달
    return 0;
}

void giveMeArray(int a)
{
    printf("%d", a);
}

OUTPUT
4

배열에 저장된 두 번째 인덱스의 값을 함수로 전달하는 예제입니다. 오직 하나의 값을 받기 때문에 함수의 매개변수는 int a로 선언되었습니다.

배열 자체를 함수의 매개변수로 사용하는 예제

참조에 의한 호출(call by reference)과 같이 배열의 메모리상의 주소를 매개변수로 받아 사용합니다.  호출부에서는 배열명을 넘기고 호출된 함수에는 호출부에서 넘어온 배열의 주소를 받습니다.

배열명 자체는 배열의 시작 주소입니다. 변수명이 메모리 주소의 이름인 것과 같이 배열명 자체도 배열이 시작되는 주소를 가리키고 있습니다. 즉 int marks[] 선언되고 초기화되었을 때 marks 자체는 배열의 시작 주소라고 생각하시면 됩니다.

#include<stdio.h>

float findAverage(int marks[]); 

int main() 
{ 
    float avg; 
    int marks[] = {99, 90, 96, 93, 95}; 
    avg = findAverage(marks);       // 배열명을 인수로 전달 
    printf("Average marks = %.1f", avg); 
    return 0; 
} 

float findAverage(int score[])  
{ 
    int i, sum = 0; 
    float avg; 
    for (i = 0; i <= 4; i++) { 
        sum += score[i]; 
    } 
    avg = (sum / 5); 
    return avg; 
} 

OUTPUT 
94.6 

함수의 매개변수를 int score[]와 같이 선언하여 전달된 배열의 주소를 받게 됩니다. 결국, 함수호출 부의 marks 배열과 함수의 score 배열은 같은 배열입니다.

C 배열 함수로 넘기기 - c baeyeol hamsulo neomgigi

함수에 다차원 배열을 전달하는 예제

#include<stdio.h>

void displayArray(int arr[3][3]); 

int main() 
{ 
    int arr[3][3], i, j; 
    printf("배열에 입력할 9개의 숫자를 입력하세요: \n"); 
    for (i = 0; i < 3; ++i) 
    { 
        for (j = 0; j < 3; ++j) 
        {     
            scanf("%d", &arr[i][j]); 
        } 
    } 
    // 배열명을 인수로 전달 
    displayArray(arr); 
    return 0; 
} 

void displayArray(int num[3][3]) 
{ 
    int i, j; 
    printf("저장된 배열은: \n"); 
    for (i = 0; i < 3; ++i) 
    { 
        // 행 바꿈 문자 추가 
        printf("\n"); 
        for (j = 0; j < 3; ++j) 
        {        
            // 값 출력시 \t 탭문자로 공백 추가 
            printf("%d\t", num[i][j]); 
        } 
    } 
} 

OUTPUT 
배열에 입력할 9개의 숫자를 입력하세요: 
1 
2 
3 
4 
5 
6 
7 
8 
9 
The complete array is: 
1 2 3 
4 5 6 
7 8 9 


일차원 배열과 마찬가지로 배열명을 함수로 전달합니다. 하지만 주의할 점은 위의 예제의 int num[3][3]와 같이 호출부의 배열과 같은 크기로 매개변수를 선언해야 합니다. 

함수에서 배열 리턴

함수에서 배열을 리턴해야 할 때는 사용 시 주의를 요구합니다. 그 이유는 함수가 종료되면 함수 내에 정의된 배열을 포함한 모든 변수가 사라지기 때문입니다.

간혹가다 배열을 리턴해야할 경우에는 아래의 코드와 같이 배열을 매개변수로 받아 값을 수정하고 배열 자체를 리턴할 수 있습니다. 이렇게 함으로서 함수가 종료된 후에도 배열이 사라지지 않기 때문입니다.

int* sum (int x[]) 
{ 
    // statements 
    return x ; 
} 

배열을 리턴하므로 함수의 리턴타입은 포인터(int*)로 정의해야 합니다.

참고 문헌 (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;
}