배열을 함수의 인자로 전달하는 방식
배열을 함수의 인자로 전달하려 할 때 배열을 통째로 전달하는 것은 불가능하다.
이때 배열의 주소 값을 인자로 전달하고 이를 통해 접근하도록 유도하는 방법이 있다.
배열의 주소 값을 전달하는 방법은 다음과 같다.
int arr[3] = {1, 2, 3};
SimpleFunc(arr);
이때 SimpleFunc 함수의 매개변수는 어떻게 선언될까? 우리는 이미 포인터를 공부하면서 이 방법에 대해 공부했다.
void SimpleFunc(int *param) {. . .}
int형 배열의 주소 값을 전달받을 것이기 때문에 int형 포인터인 매개변수를 선언해주면 된다.
포인터와 배열의 이름은 같은 것이므로 포인터 대신 배열 이름을 이용해 매개변수를 선언할 수도 있다.
void SimpleFunc(int param[]) {. . .}
함수의 호출 방식(Call-by-value, Call-by-reference)
Call-by-value: 함수를 호출할 때 단순히 값을 전달하는 형태의 함수 호출
Call-by-reference: 함수를 호출할 때 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수 호출
이 두 가지를 구분하는 기준은 함수의 인자로 전달되는 대상에 있다.
여태까지 정의했던 함수들 대부분은 주소 값을 전달하는 것이 아닌 값을 전달하는 Call-by-value이다.
Call-by-value를 사용하면 실수가 생길 수 있다. 예제의 결과를 생각해보자.
#include<stdio.h>
void Swap(int n1, int n2) {
int temp = n1;
n1 = n2;
n2 = temp;
}
int main() {
int num1 = 10;
int num2 = 20;
Swap(num1, num2);
printf("%d %d", num1, num2);
return 0;
}
// 10 20
Swap함수를 통해 값이 변경되어 20 10이 나온다라는 생각을 한 사람들이 많을 것이다. 하지만 출력 결과는 10 20이다.
이유가 무엇일까?
Swap함수의 매개변수 n1과 n2에 num1, num2의 값이 복사된다. 또한 Swap함수를 통해 n1과 n2의 값은 20 10으로
변경되지만 num1과 num2에 저장된 값의 변경으로 이어지지 않는다. num1, num2와 n1, n2는 별개의 것이기 때문이다.
이를 해결하기 위해 Call-by-reference 방식을 사용해보겠다.
#include<stdio.h>
void Swap(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main() {
int num1 = 10;
int num2 = 20;
Swap(&num1, &num2);
printf("%d %d", num1, num2);
return 0;
}
// 20 10
Swap함수에서 변수의 주소 값을 인자로 받아 변수에 직접 접근하는 형태를 볼 수 있다. 따라서 main함수에서 Swap함수가 호출되면, Swap함수의 매개변수인 p1, p2는 각각 num1, num2를 가리키게 된다.
포인터 대상의 const 선언
전 글에서도 const에 대해 소개했던 적이 있다. const는 변수를 상수화하는 목적으로 사용했었다.
const 선언은 포인터 변수를 대상으로도 선언 가능하다.
int n = 2;
const int *ptr = &n;
const 선언을 한 포인터 변수 ptr은 "ptr이 가리키는 변수에 저장된 값을 변경하는 것을 허용하지 않는다."라는 의미를 가진다.
*ptr = 30; // 컴파일 에러
n = 4; // 컴파일 성공
따라서 포인터 변수 ptr의 값을 변경하려 하면 컴파일 에러가 뜬다. 하지만 n을 상수화되지 않았기 때문에 값을 변경할 수 있다.
'Programming > C' 카테고리의 다른 글
C언어 - 포인터의 포인터(다중 포인터) (0) | 2021.10.02 |
---|---|
C언어 - 다차원 배열 (1) | 2021.10.02 |
C언어 - 포인터와 배열 (0) | 2021.09.29 |
C언어 - 포인터의 이해 (0) | 2021.09.27 |
C언어 - 1차원 배열 (0) | 2021.09.23 |
댓글