C++ 배열을 함수에 전달하는 방법: 실전 가이드
C++에서 배열을 함수에 전달하기
1차원/다차원 배열을 C++ 함수 인수로 전달하는 방법을 실전 코드 예제로 설명합니다.
C++에서 배열은 함수 인자로 전달 가능하며, 포인터를 통해 간접적으로 반환도 할 수 있습니다. 배열이 포인터로 붕괴(decay)되는 메커니즘과 메모리/성능 영향을 이해하는 건 효율적 코드 작성의 핵심입니다.
배열을 함수 매개변수로 전달하는 문법
배열을 받는 함수 선언 형태:
returnType functionName(dataType arrayName[arraySize]) {
// 함수 본문
}
예:
int total(int marks[5]) {
// 구현
}
marks는 5개 요소의 int 배열. 함수 호출 시 배열 이름(첫 요소 포인터)만 전달됩니다.
예제 1: 1차원 배열을 함수에 전달
#include <iostream>
using namespace std;
// 점수 출력 함수 선언
void display(int m[5]) {
cout << "Displaying marks:" << endl;
for (int i = 0; i < 5; ++i) {
cout << "Student " << i + 1 << ": " << m[i] << endl;
}
}
int main() {
int marks[5] = {88, 76, 90, 61, 69};
display(marks); // 배열 이름으로 전달
return 0;
}
실행 결과
Displaying marks:
Student 1: 88
Student 2: 76
Student 3: 90
Student 4: 61
Student 5: 69
핵심 포인트:
display(marks); 호출 시 marks[0] 주소 전달
- 함수 내부에서
int m[5]는 int* m;로 취급되어 같은 메모리 가리킴
m[i] 수정 시 원본 marks 배열도 변경 → **참조 전달(Pass-by-Reference) 의미론**
다차원 배열을 함수에 전달
2차원 배열의 경우 컴파일러가 요소 오프셋 계산할 수 있게 **열 개수(두 번째 차원 크기)**를 명시해야 합니다.
예제 2: 2차원 배열을 함수에 전달
#include <iostream>
using namespace std;
void display(int n[][2]) {
cout << "Displaying values:" << endl;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
cout << "num[" << i << "][" << j << "]: " << n[i][j] << endl;
}
}
}
int main() {
int num[3][2] = {{3, 4}, {9, 5}, {7, 1}};
display(num);
return 0;
}
실행 결과
Displaying values:
num[0][0]: 3
num[0][1]: 4
num[1][0]: 9
num[1][1]: 5
num[2][0]: 7
num[2][1]: 1
주의사항:
- 행 개수(3)는 선택적 – 배열 정의에서 유추 가능
- 열 크기(
[][2])는 **필수** – 올바른 포인터 연산 위해
고차원 배열도 같은 규칙: 첫 번째 차원 제외 모든 차원 크기 명시 필요.
함수에서 배열 반환
함수는 배열 전체를 직접 반환할 수 없습니다. 대신 **첫 요소 포인터**를 반환하며, 이는 정적 할당 배열, 동적 할당 배열, 임시 객체 등을 가리킬 수 있습니다. 로컬(스택) 배열 포인터 반환은 댕글링 참조 유발하므로 피해야 합니다.
예제 (정적 배열):
int* getArray() {
static int arr[5] = {1, 2, 3, 4, 5};
return arr; // 첫 요소 포인터 반환
}
동적 할당 시 std::vector<T> 반환이 안전하고 메모리 관리 자동화에 권장됩니다.
프로덕션 코드용 안전한 배열 다루기는 추가 학습 권장.