[13] 배열을 입력으로 이용하는 함수 (function using array as input)

C언어 함수 정리

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

배열 매개변수 사용하기

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

1
2
3
4
5
6
7
반환값자료형 함수이름(자료형 매개변수[])
{
}

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

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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[]로 입력(매개변수)를 지정한 경우 이는 포인터이기 때문에 배열의 요소를 변경하면 함수 바깥에 있는 배열의 값도 바뀌게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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
11
12
13
14
15
16
17
18
19
20
#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차원 배열을 매개변수로 사용하려면 매개변수 이름 뒤에 [][가로 크기] 를 붙이고 가로 크기를 지정하거나, 괄호로 묶은 포인터 뒤에 [가로 크기]를 붙인다.

1
2
3
4
5
6
7
반환값자료형 함수이름(자료형 매개변수[][가로크기])
{
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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;
}