참조에 의한 호출 — 주소 전달·포인터 매개변수·역참조로 바꾸는 swap | 기초 C언어 10.2.2-2
기초 C언어Chapter 10 포인터 › Section 02 포인터 변수와 포인터의 활용
10.2.2-2 참조에 의한 호출
값 대신 변수의 주소를 함수에 전달해 원본을 직접 바꾸는 참조에 의한 호출. 호출·정의·내부의 세 단계와 swap(&x, &y)의 결과.
영상 목차 · 원하는 부분부터 보기
01바꾸지 못한 swap에서 출발교재 307p
- 9.2.3에서 확인한 값 전달의 한계, 그리고 앞 편 CODE 10.4의 swap. 함수 안에서는 교환했지만 a·b가 복사본이라 main의 x·y는 그대로였음.
- 고칠 곳은 세 군데. 함수 호출의 swap(x, y), 함수 정의의 int a·int b 매개변수, 함수 내부의 교환 세 문장.
- 원본을 직접 바꾸려면 값이 아니라 변수의 주소를 전달해야 하며, 이를 위해 쓰는 것이 포인터.
02참조에 의한 호출의 세 단계교재 307~308p
- 참조에 의한 호출 — 변수의 값 대신 변수의 주소를 함수에 전달하는 방식. 교재 제목처럼 주소에 의한 호출이라고도 함.
| 단계 | 하는 일 | 예 |
|---|---|---|
| 함수 호출 시 | &로 변수의 주소를 인수로 전달 | swap(&x, &y); |
| 함수 정의 시 | 매개변수를 포인터 변수로 선언 | void swap(int *a, int *b) |
| 함수 내부에서 | 포인터 매개변수를 역참조해 원본 수정 | *a = *b; |
03CODE 10.5 — 주소로 두 값 바꾸기교재 308~309p
- CODE 10.4와 비교해 바뀐 곳은 앞에서 꼽은 세 군데뿐. 매개변수는 포인터, 교환 문장은 *a·*b를 사용, 호출은 swap(&x, &y).
- 실행 결과는 ‘바꾸기 전 x: 10, y: 20’, ‘바꾼 후 x: 20, y: 10’. 원본 x와 y가 실제로 맞바뀜. 상세 코드는 교재 CODE 10.5.
04주소가 전달되는 순간과 세 줄의 교환교재 309p
- swap(&x, &y)를 호출하면 x의 값 10이 아닌 x의 주소, y의 값 20이 아닌 y의 주소가 전달. 포인터 매개변수 a는 x를, b는 y를 멀리서 가리키는 상태.
- temp = *a;는 x로 찾아가 10을 temp에 저장. *a = *b;는 y의 값 20을 x에 덮어씀. *b = temp;는 10을 y에 덮어씀.
- 함수가 끝나 a와 b가 사라져도, 덮어쓴 곳은 main의 x와 y 자체이므로 바뀐 값이 그대로 남음.
사라지는 것은 포인터, 남는 것은 원본
참조에 의한 호출에서도 매개변수 a·b는 함수가 끝나면 사라짐. 다만 a·b에 담긴 것이 주소이고, *a·*b로 바꾼 대상이 원본 칸이라는 점이 값에 의한 호출과의 차이. 매개변수가 사라진다는 사실만 보고 결과까지 사라진다고 판단하지 않도록 주의.
05원본 문서의 위치를 알려 주는 방식교재 309~310p
- 원본을 직접 바꾸어야 하는 경우는 두 변수의 값을 맞바꾸는 함수, 함수 안에서 계산한 결과를 원래 변수에 저장하는 경우 등.
- 9.2.3의 복사기 비유가 복사본을 넘겨주는 방식이었다면, 참조에 의한 호출은 원본 문서가 있는 주소를 알려 주는 방식. 호출된 함수가 그 위치로 찾아가 내용을 고치므로 작업이 끝나도 수정 내용이 원본에 그대로 남음.
06하나만 반환하는 한계의 보완교재 310p
- 함수 안에서 값을 변경하면 main에 있던 원본 변수의 값도 함께 변경됨.
- return으로는 값을 하나만 돌려주지만, 주소를 받으면 여러 변수의 값을 함수 안에서 한꺼번에 수정 가능. 이것이 참조에 의한 호출의 주요 쓰임.
- 다음 10.2.3에서는 포인터와 배열의 관계로 넘어가, 배열 이름이 곧 주소라는 점을 살펴볼 예정.
이 절의 핵심 정리
- 참조에 의한 호출은 변수의 값 대신 원본 변수가 저장된 메모리의 주소를 함수에 전달한다.
- 호출할 때 &로 주소를 넘기고, 정의할 때 매개변수를 포인터로 선언하며, 함수 안에서 역참조로 원본에 접근한다.
- swap(&x, &y)를 호출하면 포인터 매개변수 a와 b가 각각 x와 y를 가리킨다.
- *a와 *b로 값을 덮어쓰면 main 함수의 원본 x와 y가 실제로 맞바뀐다.
- 참조에 의한 호출은 함수가 하나의 값만 반환하는 한계를 보완해 여러 변수를 함수 안에서 수정하게 한다.
강의 자료10.2.2-2 참조에 의한 호출
1 / 12
번호를 누르면 해당 장으로 바로 이동합니다 · 방향키 ← → 로도 넘길 수 있습니다

댓글
댓글 쓰기