C 언어에서 2차원 배열은 함수의 매개변수로 손쉽게 전달할 수 있습니다. 다만 배열을 전달할 때는 컴파일러가 메모리 주소를 정확하게 계산할 수 있도록 열(column)의 크기를 반드시 명시해야 한다는 점에 유의해야 합니다.
아래 예제는 행(row)과 열(column)의 크기가 모두 전역 상수로 선언되어 있을 때, 2차원 배열을 함수에 전달하여 각 요소의 값을 수정하는 방법을 보여줍니다.
예제
#include <stdio.h>
const int R = 4;
const int C = 3;
void func(int a[R][C]) {
int i, j;
for (i = 0; i < R; i++)
for (j = 0; j < C; j++)
a[i][j] += 5;
}
int main() {
int a[R][C];
int i, j;
for (i = 0; i < R; i++)
for (j = 0; j < C; j++)
a[i][j] = i+j;
printf("Initial 2-D array is:\n");
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
func(a);
printf("Modified 2-D array is:\n");
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}출력 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Initial 2-D array is: 0 1 2 1 2 3 2 3 4 3 4 5 Modified 2-D array is: 5 6 7 6 7 8 7 8 9 8 9 10
코드 설명
1. 전역 상수 선언: R(행 개수)과 C(열 개수)를 전역 상수로 선언하여 함수와 main()에서 모두 동일한 크기를 사용할 수 있도록 합니다.
2. 배열 초기화: main() 함수에서 이중 반복문을 사용해 각 요소를 i + j 값으로 초기화합니다.
3. 함수 호출: func(a)처럼 배열 이름만 인자로 넘기면 됩니다. C에서 배열 이름은 첫 번째 요소의 주소를 가리키므로, 함수 내부에서 수행한 변경 사항(a[i][j] += 5)이 원본 배열에 그대로 반영됩니다. 즉, 배열은 참조(call by reference) 방식으로 전달됩니다.
4. 결과 확인: 함수 호출 후 배열을 다시 출력하면 모든 요소가 5씩 증가한 것을 확인할 수 있습니다.