call by value 와 call by reference의 차이에 대해서 설명
call by value
memory architecture
|---------------------------|
| heap |
|---------------------------|
| Stack |
|---------------------------|
| Static/global |
|---------------------------|
| Code(text) |
|---------------------------|
코드상에 변수를 선언하면 메모리의 stack영역에 저장된다.
global variable은 static/global영ㅇ역에 저장된다.
main() function은 스택 프레임에 저장된다. main에서 a=10으로 값을 할당한 후
increment함수를 호출하게 되면 stack영역에 increment함수가 저장되어있는 다른 프레임을 호출한다
increment의 a 지역변수 이곳에 담겨있다.
main's increment(a)의 a는 actual argument라 하고 void increment(int a)의 a는 formal argument라고 한다.
increment 함수를 main 의 a =10이라는 값을 대입해서 호출했기 때문에 call by value라 한다
void increment(int a){//Main에 의해서 호출되는 함수이기 때문에 called function
++a ;
}
int main(){ //increment, printf를 호출하기 때문에 "calling function"이다
int a =10;
increment(a);
printf("a 의 값은 = %d\n", a); //11 이 출력될것이라 예상하지만 10 이 출력된다
/* 그 이유?
main 함수에서 선언한 a는 local variable이다
*/
//Increment(&a);
//printf("call by reference = %d",a);
return 0;
}
위 코드를 출력 하면 결과값은 10이 나온다 그 이유는 메모리 구조때문이다.
main 함수의 a와 increment function의 a는 서로 다른 변수 이기 때문에다.
그렇다면 increment 함수를 호출해서 a의 값을 증가시키고 싶다면 어떻게 해야될까?
그때 call by reference를 사용하면된다.
call by reference
void Increment(int *p){
*p = (*p)+1;
}
int main(){ //increment, printf를 호출하기 때문에 "calling function"이다
int a =10;
increment(a);
printf("a 의 값은 = %d\n", a); //11 이 출력될것이라 예상하지만 10 이 출력된다
/* 그 이유?
main 함수에서 선언한 a는 local variable이다
*/
Increment(&a);
printf("call by reference = %d",a);
return 0;
}
위함수의 두번쨰 출력값의 결과는 11이다.
그 이유는 Increment 함수를 호출할때 매인에셔 a의 메모리 주소값을 넘겨 주었기 때문이다.
main의 a값이 저장된 메모리의 주소를 300 이라고 가정하면
Increment의 인자로 300이라는 주소가 전달된다 .
그럼 Increment함수 내부에서 300이라는 주소에 있는 값을 +1 증가시킨다.
그래서 보통 값을 변화시킬때 나는 call by value를 사용하여 subfunction내부에서 출력하는 방법을 사용한다.
'What i learn.' 카테고리의 다른 글
[MySQL] install on MacOS (0) | 2020.08.20 |
---|---|
[ Java] 08/11 Abstract Class, Interface (0) | 2020.08.12 |
[C++] 변수, 메모리 할당 (0) | 2020.04.23 |
[정보처리기사] Software architecture (0) | 2020.04.20 |
[Algorithm] 알고리즘 기초 (0) | 2020.02.17 |