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이거나 잘못된 주소를 가리키면 프로그램이 비정상 종료될 수 있습니다. 항상 초기화된 주소를 사용해야 합니다.
'프로그래밍언어 > C언어[초급]' 카테고리의 다른 글
[C언어][초급] Chapter56. 구조체 멤버 접근 – 점(.)과 화살표(→) 연산자 차이 알기 (0) | 2025.04.19 |
---|---|
[C언어][초급] Chapter55. 구조체의 선언과 사용 – 여러 데이터를 하나로 묶는 방법 (0) | 2025.04.19 |
[C언어][초급] Chapter53. 포인터와 문자열 – 문자열을 더 유연하게 다루는 방법 (0) | 2025.04.19 |
[C언어][초급] Chapter52. 포인터와 배열 – 배열의 시작 주소와 포인터의 관계 (0) | 2025.04.19 |
[C언어][초급] Chapter51. 포인터 선언과 사용 – 다양한 자료형의 포인터 활용하기 (0) | 2025.04.19 |