반응형
C 언어에서 배열을 함수에 전달하는 방식은 흔히 포인터 개념과 함께 이해해야 합니다. 이번 글에서는 배열을 함수 인자로 전달하는 방법과 함께, Call-by-value와 Call-by-reference의 차이를 정리해보겠습니다.
C 언어에서 배열은 함수에 그대로 전달할 수 없지만, 배열의 주소는 전달할 수 있습니다. 이와 관련된 개념과 함수 호출 방식의 차이를 정리해보겠습니다.
1. 함수 인자로 배열을 전달하는 방법
- 함수 호출 시, 전달되는 것은 실제 인자 자체가 아닌 인자에 저장된 값이 복사됩니다.
- C 언어에서는 배열 자체를 매개변수로 받을 수는 없지만, 배열의 주소 값을 전달하여 배열을 다룰 수 있습니다.
- 이를 위해 함수의 매개변수를 포인터 변수로 선언합니다.
void SimpleFunc(int * param) {
// param은 배열의 주소를 받아 배열처럼 사용 가능
}
- 다음 두 함수 선언은 동일하게 작동합니다.
void SimpleFunc(int * param);
void SimpleFunc(int param[]);
- 함수 내부에서는 포인터를 통해 배열의 요소 값을 변경할 수 있으며, 이는 원래 배열에도 영향을 미칩니다.
2. Call-by-value vs Call-by-reference
Call-by-value
- 단순히 값만 전달하는 방식입니다.
- 함수 내부에서 값을 변경해도 원본에는 영향이 없습니다.
void Func(int val) {
val = 10; // 원본 변수는 바뀌지 않음
}
Call-by-reference
- 주소 값을 전달하여, 함수 내에서 실제 메모리 공간에 접근할 수 있는 방식입니다.
- 함수 내부에서 값을 변경하면 원본 변수도 함께 바뀝니다.
void Func(int * ptr) {
*ptr = 10; // 원본 변수의 값이 변경됨
}
예제
문제 1
변수 num에 저장된 값의 제곱을 계산하는 함수를 정의하고, 이를 호출하는 main 함수를 작성해보자. 단, 여기서 다음 두 가지 형태로 함수를 정의해야 한다.
· Call - by - value 기반의 SquareByValue 함수
· Call - by - refernece 기반의 SquareByReference 함수
SquareByValue 함수는 인자로 전달 된 값의 제곱을 반환해야 하며, SquareByReference 함수는 정수가 저장되어 있는 변수의 주소 값을 인자로 받아서 해당 변수에 저장된 값의 제곱을 그 변수에 다시 저장해야 한다.


문제 2
세 변수에 저장된 값을 서로 뒤바꾸는 함수를 정의해보자. 예를 들어서 함수의 이름이 Swap3라하면, 다음의 형태로 함수가 호출되어야 한다.
Swap3(&num1, &num2, &num3);
그리고 함수호출의 결과로 num1에 저장된 값은 num2에, num2에 저장된 값은 num3에, 그리고 num3에 저장된 값은 num1에 저장되어야 한다.


✅ 정리
- 배열은 함수에 직접 전달되지 않고 주소 값만 전달됩니다.
- int param[]와 int * param은 본질적으로 동일합니다.
- Call-by-reference는 메모리 주소를 통해 원본 데이터를 수정할 수 있어, 배열이나 구조체를 다룰 때 자주 사용됩니다.
반응형
'공부 > C언어' 카테고리의 다른 글
[C언어] 윤성우의 열혈 C 프로그래밍 - 도전! 프로그래밍2 (0) | 2025.05.14 |
---|---|
[C 언어] 포인터의 const 선언 완벽 정리 (0) | 2025.05.12 |
[C언어] 포인터 상수 형태의 문자열과 포인터 배열 개념 정리 (0) | 2025.05.11 |
[C언어] 포인터와 배열의 관계, 그리고 포인터 연산 정리 (0) | 2025.05.09 |
[C언어] 포인터의 이해 (0) | 2025.05.08 |