함수의 호출 방식
- Call-by-value
- Call-by-reference
값을 전달하는 형태의 함수호출: Call-by-value
Call-by-value : 함수를 호출할 때 단순히 값을 전달하는 형태의 함수호출
Call-by-reference : 함수를 호출할 때 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수호출
★ 구분하는 기준 : 함수의 인자로 전달되는 대상.
구분하는 이유?
다음 예제와 같은 실수를 막기 위해
#include <stdio.h>
void swap(int, int);
int main(void)
{
int num1 = 20;
int num2 = 30;
printf("num1 : %d, num2 : %d \n", num1, num2);
swap(num1, num2);
printf("num1 : %d , num2 : %d \n", num1, num2);
}
void swap(int n1, int n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
printf("n1 : %d, n2 : %d \n", n1, n2);
}
num1과 num2에 저장된 값이 변경되기를 기대하면서 swap 함수를 호출하고 있으나 n1과 n2에 저장된 값만 변경시키는 것일 뿐, num1과 num2에 저장된 값의 변경으로까지 이어지지 않는다.
num1, num2는 n1, n2와 완전히 별개의 것이기 때문
결국 두 매개변수(n1, n2 사이에서만 값의 변환이 일어난 것임)
주소 값을 전달하는 형태의 함수호출: Call-by-reference
위 문제를 call-by-reference로 해결할 수 있다.
num1과 num2의 주소 값을 swap함수로 전달 → num1과 num2에 직접 접근이 가능하도록
#include <stdio.h>
void swap(int*, int*);
int main(void)
{
int num1 = 20;
int num2 = 30;
printf("num1 : %d, num2 : %d \n", num1, num2);
swap(&num1, &num2);
printf("num1 : %d , num2 : %d \n", num1, num2);
}
void swap(int* ptr1, int* ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
swap 함수는 주소 값을 인자로 받아서 해당 변수에 직접 접근하는 형태
swap 함수가 호출되면
- ptr1과 ptr2는 각각 num1과 num2를 가리키는 상황이 된다.
- *ptr1 = num1, *ptr2 = num2
위 그림과 같이 num1와 num2에 저장된 값이 서로 바뀐다.
이제는 scanf 함수호출 시 & 연산자를 붙이는 이유를 알 수 있다.
int main(void)
{
int num;
scanf("%d", &num);
}
- 위의 scanf 함수 호출이 완료되면 변수 num에는 값이 채워진다.
- 프로그램 사용자로부터 값을 입력 받아서 변서 num에 그 값을 채우는 일을 scanf 함수가 하는 것이다.
- 그리고 이를 위해서 scanf 함수는 변수 num의 주소 값을 알아야 한다.
- 그래야 변수 num에 접근을 해서 값을 채워 넣을 수 있기 때문이다.
- 그래서 함수호출 시에 변서 num의 주소 값을 전달하고 있다.
- 따라서 scanf 함수 호출도 call-by-reference 형태의 함수호출에 해당한다.
그렇다면 문자열을 입력 받을 때는 왜 & 안붙임?
int main(void)
{
char str[30];
scanf("%s", str); // scanf("%s", &str);은 잘못된 문장 구성이다.
}
이전에 배운대로 str은 그 자체로 배열 주소의 값이기 때문에.
참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C' 카테고리의 다른 글
다차원 배열(16-1) 다차원 배열의 이해와 활용 (0) | 2020.12.09 |
---|---|
포인터와 함수에 대한 이해(14-3) 포인터 대상의 const 선언 (0) | 2020.12.08 |
포인터와 함수에 대한 이해(14-1) 함수의 인자로 배열 전달하기 (0) | 2020.12.08 |
포인터와 배열! 함께 이해하기(13-4) 포인터 변수로 이뤄진 배열: 포인터 배열 (0) | 2020.12.08 |
포인터와 배열! 함께 이해하기(13-3) 상수 형태의 문자열을 가리키는 포인터 (0) | 2020.12.08 |