안녕하세요. 복학하고 바빠서 오랜만에 글을 쓰네요.
오늘 알아볼것은 call by value, call by address 입니다.
이것들은 함수의 매개변수에 어떤값을 넣는가에 대한 개념입니다.
순서대로 대략적인 의미를 전달해보자면
call by value : 값에 의한 전달
call by reference : 주소에 의한 전달
입니다.
말로만 해선 무슨 말인지 모를 수 있을테니 순서대로 설명하면서 코드를 함께 볼게요.
1.call by value
#include <stdio.h>
void swap(int num1,int num2)
{
int tmp;
tmp = num1;
num1 = num2;
num2 = tmp;
}
void main()
{
int a = 1;
int b = 2;
swap(a,b);
printf("a = %d, b = %d", a, b);
}
함수를 통해 a와 b의 값을 바꾸고 싶은 상황입니다. 하지만 실행결과 전혀 바뀐게 없습니다. 왜 이럴까요?
우선 함수는 호출되면 num1에 a값이, num2에 b값이 그대로 들어가는게 아니라 복사된 값이 들어갑니다.
그리고 전달받은 매개변수를 가지고 두 값을 바꿉니다.
그 다음은?
無(무), 없어요 그냥
지금까지 함수가 했던 행동들은 다 쓰잘머리없는 짓들이였습니다. 함수 타입도 void라 반환도 없고 함수 안의 변수들은 지역변수라 함수가 끝나는 동시에 사라져버립니다.
2.call by reference
#include <stdio.h>
void swap(int *num1, int *num2)
{
int tmp;
tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
void main()
{
int a = 1;
int b = 2;
swap(&a, &b);
printf("a = %d, b = %d", a, b);
}
드디어 두 값을 바꾸는데 성공했습니다. 어떻게 성공했는지 보겠습니다.
이번에는 a와 b의 주소를 넘겨줬습니다.
그래서 이번에는 int *num1 은 a의 주소를 값으로 가지고, int *num2는 b의 주소를 값으로 가집니다.
즉 [num1 == a의 주소, num2 == b의 주소] 가 되겠습니다.
여기에 역참조 연산자 '*' 를 num1과 num2에 취해주면 각각 a와 b의 값에 접근하게 됩니다.
그래서 값을 수정할 수 있게되요.
참, 그리고 num1과 num2는 각각 a,b 와는 서로 다른 주소에 할당됩니다. 그리고 함수가 종료되면 지역변수기에 사라집니다.
이상으로 마치겠습니다.
혹시라도 질문이 있으면 알려주세용
'언어 > C언어' 카테고리의 다른 글
[C 언어] 8. 배열 (0) | 2024.04.14 |
---|---|
[C 언어] 7. 제어문 (0) | 2024.04.14 |
[C 언어] 6. 변수와 자료형(더 자세히2) (0) | 2024.04.14 |
[C 언어] 5. 변수와 자료형(더 자세히1) (0) | 2024.04.14 |
[C 언어] 번외) 프로그램 개발 과정 (0) | 2024.04.14 |