참조에 의한 호출 — 주소 전달·포인터 매개변수·역참조로 바꾸는 swap | 기초 C언어 10.2.2-2

기초 C언어Chapter 10 포인터 › Section 02 포인터 변수와 포인터의 활용

10.2.2-2 참조에 의한 호출

값 대신 변수의 주소를 함수에 전달해 원본을 직접 바꾸는 참조에 의한 호출. 호출·정의·내부의 세 단계와 swap(&x, &y)의 결과.

교재 수록 위치
교재
『기초 C언어』 · 이은상 · 부크크 · 364쪽
단원
Chapter 10 포인터 › Section 02 포인터 변수와 포인터의 활용 › 참조에 의한 호출
쪽수
307p ~ 310p4쪽
세부 내용
참조에 의한 호출 예제 · 세 단계 · CODE 10.5 · 포인터를 이용한 참조에 의한 호출 개념
학습 목표
참조에 의한 호출의 세 단계를 구분하고, 주소를 전달받은 함수가 원본 변수를 바꾸는 과정을 설명함
영상 목차 · 원하는 부분부터 보기
  1. 0:00 · 강의 소개와 주소 전달
  2. 1:58 · 호출·정의·역참조의 세 단계
  3. 3:01 · 주소로 두 값을 바꾸는 swap
  4. 5:12 · 주소 전달과 원본 값 교환 과정
  5. 7:10 · 원본 수정이 필요한 경우
  6. 9:50 · 핵심 정리

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에서는 포인터와 배열의 관계로 넘어가, 배열 이름이 곧 주소라는 점을 살펴볼 예정.

이 절의 핵심 정리

  1. 참조에 의한 호출은 변수의 값 대신 원본 변수가 저장된 메모리의 주소를 함수에 전달한다.
  2. 호출할 때 &로 주소를 넘기고, 정의할 때 매개변수를 포인터로 선언하며, 함수 안에서 역참조로 원본에 접근한다.
  3. swap(&x, &y)를 호출하면 포인터 매개변수 a와 b가 각각 x와 y를 가리킨다.
  4. *a와 *b로 값을 덮어쓰면 main 함수의 원본 x와 y가 실제로 맞바뀐다.
  5. 참조에 의한 호출은 함수가 하나의 값만 반환하는 한계를 보완해 여러 변수를 함수 안에서 수정하게 한다.
강의 자료10.2.2-2 참조에 의한 호출 1 / 12

번호를 누르면 해당 장으로 바로 이동합니다 · 방향키 ← → 로도 넘길 수 있습니다
다음 절 · 10.2.3-1 배열 이름과 주소 교재 311p~313p — 식에서 첫 번째 요소의 주소로 변환되는 배열 이름 ↗

더 자세한 내용은 교재에서

이 글은 『기초 C언어』 307p~310p의 내용을 강의 영상에 맞춰 핵심만 간추린 요약입니다. 각 개념의 상세한 설명과 예제, 실습 코드, 임용시험 기출문제 풀이는 교재에서 다루고 있습니다.

댓글

이 블로그의 인기 게시물

2007년 국가직 9급 기계일반 기출문제 풀이

기계공작법 연습문제 130문 | 임용 기출 영상·교재 쪽수 바로가기