C 함수 매개변수 배열 - sonkoni/Koni-Wiki GitHub Wiki

함수에서 배열 매개변수 사용

컴파일러 내부에서는 매개변수로 받는 배열형태포인터형태로 바뀐다. 그래서 둘 다 똑같다. 그냥 편의상 배열이라고 표시하기 위해 배열형식을 쓰는 것이다.

매개변수에 배열 전달

#include <stdio.h>

// 배열 매개변수에 배열 넣기. 갯수도 함께 받아야 함.
void printArray(int arr[], int count) {
    for (int i = 0; i < count; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 포인터 매개변수에 배열 넣기. 갯수도 함께 받아야 함.
void printArrPtr(int *arr, int count) {
    for (int i = 0; i < count; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main(int argc, char *argv[]) {
    int numArr[] = {1, 2, 3, 4, 5};
    int count = sizeof(numArr) / sizeof(int);
    printArray(numArr, count);
    printArrPtr(numArr, count);
    return 0;
}
// 1 2 3 4 5
// 1 2 3 4 5

리터럴로 배열 넘기기

#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 argc, char *argv[]) {
    int numArr[] = {1, 2, 3, 4, 5};
    printArray((int[]){1, 2, 3, 4, 5}, 5);
    //         ======================  ==
    //              리터럴배열            갯수
    return 0;
}
// 1 2 3 4 5

매개변수로 받은 배열을 변경하기

매개변수로 받은 배열을 변경하면 원본도 변경된다.

#include <stdio.h>
void setElement(int arr[]) {
    arr[0] *= 10;
    arr[1] *= 20;
}

int main(int argc, char *argv[]) {
    int numArr[] = {1, 2, 3, 4, 5};
    setElement(numArr);
    printf("%d %d\n", numArr[0], numArr[1]);

    return 0;
}
// 10 40

배열의 특정 요소를 바꿔보기

#include <stdio.h>

void swapElement(int arr[], int firstIdx, int secondIdx) {
    int temp = arr[firstIdx];
    arr[firstIdx] = arr[secondIdx];
    arr[secondIdx] = temp;
}

int main(int argc, char *argv[]) {
    int numArr[] = {1, 2, 3, 4, 5};
    int count = sizeof(numArr) / sizeof(int);
    swapElement(numArr, 1, 2);       // 1번 인덱스와 2번 인덱스 값을 서로 바꾸겠다.
    for (int i = 0; i < count; i++) {
        printf("%d ", numArr[i]);
    }
    return 0;
}

배열 매개변수의 최소 유닛 갯수 지정하기(clang, gcc)

배열 매개변수 선언에서 static 으로 갯수를 지정한다. 만약 이보다 적으면 컴파일러 경고가 뜬다.

    자료형 배열이름[static 최소갯수]
#include <stdio.h>

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

int main(int argc, char *argv[]) {
    int numArr[] = {1, 2, 3, 4};
    int count = sizeof(numArr) / sizeof(int);
    printArray(numArr, count);  // 컴파일러 경고 발생. 함수에서 최소 5개 이상의 배열을 요구하기 때문.
    return 0;
}

2차원 배열을 매개변수로

매개변수로 2차원 배열을 쓰려면 아래처럼 하면 된다. 세로 갯수는 쓰더라도 무시한다.
2차원 배열읠 실제 크기를 알 수 없으므로, 다른 매개변수로 배열의 가로와 세로 크기를 받아야 한다.

    자료형 배열이름[][가로갯수]
    자료형 (배열포인터)[가로갯수]

예시
    void printArray(int arr[][4], int col, int row) {...}
    void printArrPtr(int (*arr)[4], int col, int row) {...}
#include <stdio.h>

void printArray(int arr[][4], int col, int row) {
    //          ============
    for (int i = 0; i < row; i++) {
        printf("a: => ");
        for (int j = 0; j < col;  j++) {
            printf("%2d ", arr[i][j]);
        }
        printf("\n");
    }
}

void printArrPtr(int (*arr)[4], int col, int row) {
    //           =============
    for (int i = 0; i < row; i++) {
        printf("b: => ");
        for (int j = 0; j < col;  j++) {
            printf("%2d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main(int argc, char *argv[]) {
    int numArr[2][4] = {{1, 2, 3, 4},
                        {11, 22, 33, 44}};
    int colCount = sizeof(numArr[0]) / sizeof(int);     // 가로 한줄을 자료형 크기로 나누면 칼럼 갯수가 나옴
    int rowCount = sizeof(numArr) / sizeof(numArr[0]);  // 배열이 차지하는 공간을 가로 한 줄의 크기로 나눔

    printArray(numArr, colCount, rowCount);
    printArrPtr(numArr, colCount, rowCount);
    return 0;
}
// a: =>  1  2  3  4
// a: => 11 22 33 44
// b: =>  1  2  3  4
// b: => 11 22 33 44

복합리터럴 방식으로 2차원 배열 넘기기

    (자료형[][가로]){{값, 값}, {값, 값}}
    (자료형[세로][가로]){{값, 값}, {값, 값}}
#include <stdio.h>

void printArray(int arr[][4], int col, int row) {
    for (int i = 0; i < row; i++) {
        printf("a: => ");
        for (int j = 0; j < col;  j++) {
            printf("%2d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main(int argc, char *argv[]) {
    printArray((int[][4]){{1, 2, 3, 4}, {5, 6 ,7, 8}}, 4, 2);
    return 0;
}
// a: =>  1  2  3  4 
// a: =>  5  6  7  8 
⚠️ **GitHub.com Fallback** ⚠️