값에 의한 호출 예제 — swap 함수·임시 변수 temp·복사본 매개변수 | 기초 C언어 10.2.2-1
기초 C언어Chapter 10 포인터 › Section 02 포인터 변수와 포인터의 활용
10.2.2-1 값에 의한 호출 예제
두 값을 맞바꾸는 swap 함수로 다시 확인하는 값에 의한 호출. 함수 안에서는 교환되지만 main의 원본 x·y는 그대로인 까닭.
영상 목차 · 원하는 부분부터 보기
019장에서 남긴 값에 의한 호출의 한계교재 306p
- 9.2.3에서 add_ten에 넘긴 변수는 호출 뒤에도 값이 그대로였음. 값에 의한 호출로는 원본 변수의 값을 수정할 수 없다는 확인.
- 값에 의한 호출 — 변수 자체가 아니라 변수에 저장된 값만 복사하여 전달하는 방식. 매개변수를 바꾸어도 main의 원본은 바뀌지 않음.
- 앞 편에서 포인터로 다른 변수의 값을 바꾸는 방법을 익힘. 이번 편은 그 필요성을 두 값을 맞바꾸는 swap 함수로 다시 확인하는 단계.
02CODE 10.4 — 값을 넘기는 swap교재 306p
- swap 함수는 int형 매개변수 a, b를 받아 두 값을 서로 교환. main 함수는 x를 10, y를 20으로 초기화한 뒤
swap(x, y);를 호출하고 전후의 값을 출력. - 실행 결과는 ‘바꾸기 전 x: 10, y: 20’과 ‘바꾼 후 x: 10, y: 20’. swap을 호출했는데도 두 줄의 값이 같음. 상세 코드는 교재 CODE 10.4.
- 호출 전 출력, swap 호출, 호출 후 출력의 짜임. 호출 전과 후의 x·y를 견주어 원본이 바뀌었는지 확인하는 구성.
03임시 변수 temp를 거친 교환교재 307p
- 교환은 세 단계. a의 값을 temp에 담고, b의 값을 a에 넣고, temp의 값을 b에 넣음.
- temp 없이 a에 b를 바로 넣으면 a의 원래 값이 사라짐. 값을 잠시 담아 두는 세 번째 변수가 필요한 이유.
| 단계 | temp | a | b |
|---|---|---|---|
| 교환 전 | — | 10 | 20 |
| temp = a; | 10 | 10 | 20 |
| a = b; | 10 | 20 | 20 |
| b = temp; | 10 | 20 | 10 |
04호출할 때 복사되는 값교재 307p
- swap(x, y)를 호출하면 x와 y 자체가 아니라 x의 값 10과 y의 값 20이 복사되어 전달. 매개변수 a에는 10, b에는 20이 저장됨.
- swap 안에서 a는 20, b는 10으로 바뀜. 함수 안의 교환 자체는 정상으로 이루어진 것.
- main의 x·y와 swap의 a·b는 서로 다른 메모리 공간. 9.2.3의 복사기 비유처럼 복사본에 적은 내용은 원본 문서에 옮겨지지 않음.
05a와 b는 복사본교재 307p
- a와 b는 x와 y의 복사본이므로 main의 x, y에는 영향을 주지 않음.
- swap 함수가 종료되면 매개변수 a와 b는 바뀐 값과 함께 사라짐. main으로 돌아오면 x는 여전히 10, y는 여전히 20.
함수 안의 교환이 틀린 것이 아님
swap의 세 문장은 a와 b를 올바르게 맞바꿈. 문제는 교환 대상이 원본이 아니라 복사본이라는 점. 코드를 고쳐도 값만 넘기는 한 원본은 바뀌지 않으므로, 전달하는 것 자체를 바꾸어야 함.
06원본을 바꾸려면 주소를 전달교재 307p
- 함수 안에서 main의 x와 y를 직접 바꾸려면 변수의 값이 아니라 변수의 주소를 전달해야 함. 10.1.1에서 값 대신 집 주소를 알려 주면 원본을 고칠 수 있다고 한 바로 그 방법.
- 주소를 전달하는 데 쓰는 것이 포인터이며, 주소를 담는 포인터 변수는 10.2.1에서 이미 다룸. 다음 편에서는 swap(&x, &y)로 주소를 넘기는 참조에 의한 호출을 살펴볼 예정.
이 절의 핵심 정리
- 값에 의한 호출은 변수 자체가 아니라 변수에 저장된 값만 복사하여 함수에 전달한다.
- swap(x, y)를 호출하면 x의 값 10과 y의 값 20이 매개변수 a와 b에 복사된다.
- swap 함수 안에서는 임시 변수 temp를 거쳐 a와 b의 값이 서로 바뀐다.
- a와 b는 복사본이므로 함수가 종료되면 사라지고 main의 x와 y는 그대로 남는다.
- 함수 안에서 원본 변수를 직접 바꾸려면 값이 아니라 변수의 주소를 전달해야 한다.
강의 자료10.2.2-1 값에 의한 호출 예제
1 / 11
번호를 누르면 해당 장으로 바로 이동합니다 · 방향키 ← → 로도 넘길 수 있습니다

댓글
댓글 쓰기