Programming

call by value / call by reference[펌]

루나s 2017. 1. 17. 17:33

ref: http://choieun.tistory.com/entry/Call-by-value%EC%99%80-Call-by-reference


call by value 와 call by reference의 차이점은 
swap 함수의 구현으로써 
설명 할 수 있다!!

'Call by value'닫기

<Call by value>

1. Call by value : 
우리말로하면 바로 "값에 의한 호출"이란 뜻으로, 어떤 함수를 호출할때에 전달인자로 그 데이터 값 자체를 전달하는 호출 방법이다.

2. swap함수의 구현
위와 같은 소스를 실행시켜보았을때,  swap함수대로 a와 b의 값이 제대로 바뀌지 않은채로
출력하는걸 볼수 있다.
함수 호출시 ===> swap(a,b);    
(소스의 빨간 숫자들은 순서를 표현하기 위해 임의로 붙여놓은것, 소스코드와는 상관없다)


3. 스택(Stack)으로 나타내기 

붙인 번호순서대로 
메모리 상황을 스택으로 그려보면 다음과 같다


① 변수 a와 b가 선언되고, 그 값으로 3과 5이 들어간다. (a부터 들어가고, b가 올라감)

② swap 함수가 불려지면 함수 정의 부분으로 가되, 전달인수로는 a=3, b=5 가 스택이 순서로 들어간다.
   (a와 b의 데이터 자체를 전달인자로 호출)
  그리고 새로 선언된 int형 tmp 변수가 선언된다.

③ 변수 tmp에는 현재 a의 값이 3이 입력되고, 그다음 변수 a에는 현재 변수 b의 값인 5이 입력된다.

④ 변수 b에는 현재 tmp의 값인 3이 입력된다.

⑤ swap함수의 동작이 모두 끝나고 나면 swap 함수에서 썼던 변수들은(붉은색 부분) 
스택에서 모두 나가 사라진다.
   pintf 실행시 결국 a와 b값은 그대로 3과 5가 출력된다.

'Call by value'닫기


'Call by reference' 닫기


<Call by reference>

1. Call by reference : 
       우리말로 "참조에 의한 호출"라는 뜻으로, 어떤 특정한 데이터 값이 아닌 그값에 대한 정보를 전달하는 호출방법이다.

2.swap 함수의 구현

위와같이 구현하여 실행시켰을때,  a와 b의 변수값이 제대로 바뀐것을 볼 수 있다.
함수호출시 ===> 
swap(&a, &b)
                        변수  a와 b의 주소값을 인자로 전달함!!!
(소스의 빨간 숫자들은 순서를 표현하기 위해 임의로 붙여놓은것, 소스코드와는 상관없다)

3. 스택(Stack)으로 나타내기

소스코드에 붙인 번호순서대로 
메모리 상황을 스택으로 그려보면 다음과 같다

① 변수 a와 b가 선언되고, 그 값으로 3과 5이 들어간다.
 
(변수 a가 저장된 메모리의 주소값이 100, b의 메모리 주소값은 104라 가정)

③ swap 함수가 불려지면 함수 정의 부분으로 가되, 전달인수로는 a의 주소값 100, b의 주소값 104.
   (전달인수의 형식은 주소값, 포인터형식 *a, *b)
   그리고 새로 선언된 int형 tmp 변수가 선언된다.

④ 변수 tmp에는 *a가 가리키고있는 곳(100번지)의 ,즉 3이 들어간다.
   그다음 *a가 가리키고있는 곳(100번지)의 은 *b가 가리키고있는 곳(104번지)의 과 같게된다.
   즉 tmp=3 그리고 a=5 가된다.

⑤  *b가 가리키고있는 곳(104번지)의 은 tmp의 값, 즉 3이 된다. (b=3)

⑥ swap함수의 동작이 모두 끝나고 나면 swap 함수에서 썼던 변수들은(붉은색 부분) 
스택에서 모두 나가 사라진다.
   pintf 실행시 a와 b의 값이 처음값에서 뒤바뀌어 출력된다!

'Call by reference' 닫기