본문 바로가기
프로그래밍언어/C언어[초급]

[C언어][초급] Chapter54. 포인터를 이용한 함수 호출 – (call by value, call by reference)

by about_IT 2025. 4. 19.
728x90

C언어에서 함수를 호출하면 기본적으로 값에 의한 호출(call by value)이 일어나기 때문에
함수 안에서 변수 값을 바꾸더라도 원본에는 영향을 주지 않습니다.

하지만 포인터를 사용하면 함수 안에서 원래 변수의 값을 직접 변경할 수 있습니다.
이를 포인터를 이용한 함수 호출(call by reference)이라고 부릅니다.


● 값에 의한 호출 예시

void change(int x) {
    x = 100;
}

int main() {
    int a = 10;
    change(a);
    printf("%d\n", a); // 여전히 10
}

함수 안에서 변수 값을 바꿔도 원래 변수에는 영향을 주지 않습니다.


● 포인터를 이용한 호출

void change(int *x) {
    *x = 100;
}

int main() {
    int a = 10;
    change(&a);
    printf("%d\n", a); // 100
}

주소를 전달하고, 함수 안에서 그 주소가 가리키는 값을 바꾸면 원본 변수도 같이 바뀝니다.


● 두 값 바꾸기 예제

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

두 변수의 주소를 넘기면 실제 값이 바뀌는 함수가 됩니다.


● 요약

  • 값에 의한 호출: 원본 값은 변하지 않음
  • 포인터에 의한 호출: 함수 안에서 원본 값 변경 가능
  • 주로 배열, 구조체, 여러 값 변경 시 포인터를 사용

포인터를 이용하면 함수가 변수에 직접 접근하게 만들 수 있어 유용합니다.
데이터를 바꾸거나 두 값을 교환하는 등의 작업은 반드시 포인터를 통해 해야 합니다.


● 실습 문제

문제 1

int형 변수 a = 5를 포인터를 통해 함수에서 20으로 바꾸는 코드를 작성하세요.

 

문제 2

두 개의 정수를 입력받아 swap 함수로 값을 교환하세요.

 

문제 3

값에 의한 호출과 포인터에 의한 호출의 차이를 설명하세요.

 

문제 4

다음 코드에서 출력 결과는?
int a = 3;
change(&a);
printf("%d", a);

 

문제 5

포인터를 함수 인자로 사용할 때 주의할 점 한 가지를 작성하세요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

▶ 정답 확인하기

정답 1

void setTwenty(int *p) {
    *p = 20;
}

int a = 5;
setTwenty(&a);

 

정답 2

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

 

정답 3

값에 의한 호출은 원래 변수에 영향을 주지 않지만, 포인터를 이용한 호출은 원본 값이 바뀝니다.

 

정답 4

change 함수가 포인터로 선언되었다면 출력 결과는 100이 됩니다.

 

정답 5

포인터가 NULL이거나 잘못된 주소를 가리키면 프로그램이 비정상 종료될 수 있습니다. 항상 초기화된 주소를 사용해야 합니다.

728x90