본문 바로가기
OLD/[C]정리중

[개탱][Call By Value][Call By reference]

by 개탱 2018. 1. 2.
728x90

(예시 코드는 swap 함수로 a와 b의 값을 바꾸려고 하는 코드이다)


Call By Value

호출 시킨 값을 복사해와서 작업을 함.. [ 값에 직접적인 영향이 없음 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void swap(int A, int B);
void main()
{
    int a, b;
    a = 30;
    b = 20;
    swap( a, b);
}
 
void swap(int A, int B)
{
    int iTmp = A;
    A = B;
    B = iTmp;
}
cs

int a, b 를 선언 후 a에 30을 대입, b에 20을 대입( a= 30, b = 20 )

main 안에 있는 local value인 a와 b의 값을 복사를 해서  

swap의 매개변수인 A, B 에 넣어주고 그 값으로 (A = 30, B = 20)

안에 int 형 iTmp를 선언후 A의 값을 넣어주게 되며 (iTmp = 30)

A에 B의 값을 넣은후 ( A = 20 )

B에 iTmp 값을 넣음으로서 B = 30 ) 함수가 끝이나고 돌아오는데

결국 a와 b의 값은 그대로 유지된다.

이렇게 되면 swap 함수를 만든 의미가 없다..



Call By reference

호출 시킨 값의 주소를 가져와서 작업을 함.. [ 값에 직접적인 영향이 있음 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void swap(int* A, int* B);
void main()
{
    int a, b;
    a = 30;
    b = 20;
    swap(&a, &b);
}
 
void swap(int* A, int* B)
{
    int iTmp = *A;
    *= *B;
    *= iTmp;
}
cs


이번에는

int a, b 를 선언 후 a에 30을 대입, b에 20을 대입( a= 30, b = 20 )

main 안에 있는 local value인 a와 b의 주소값을 복사해서

swap의 매개변수인 (포인터)A, (포인터)B에 넣어주고 (A = &a, B = &b)


안에 int 형 iTmp를 선언후 A가 가르키고 있는 곳의 값 넣어주게 되며 (iTmp = 30)

(A 의 안에는 &a(a의 주소값)이 들어있으며 그 주소의 데이터에 다가가보니 30이란 값이 있었다.)

(그후 local value(지역변수)인 iTmp의 값에 위의 값을 넣어줌으로서 iTmp = 30 이 된다.)


A가 가르키고 있는 곳의 값에 B가 가르키고 있는 곳의 값의 값을 넣은후 ( a = 20 )

(B 의 안에는 &b(b의 주소값)이 들어있으며 그 주소의 데이터에 다가가보니 20이란 값이 있었다.)

(그 값을 A가 가리키고 있는 a의 값에다 대입을 해준다. )


B가 가르키고 있는 곳의 값에 iTmp 값을 넣음으로서 b = 30 )

(B 의 안에는 &b(b의 주소값)이 들어있으며 그 주소의 데이터에 다가가보니 20이란 값이 있었다.)

(그 값에 swap의 local value(지역변수)인 iTmp 의 값(30)을 넣어줌으로서 b = 30이 된다 )

 함수가 끝이나고 돌아오는데


결국 a와 b의 값이

a = 20, b = 30 으로 두개의 값이 바뀌게된다.



이렇게 다른 함수에 데이터를 넘겨줄 때

값만 복사해서 넘겨주는 경우  Call By value(콜 바이 벨류) 라고 부르며


자신의 주소를 넘겨주는 경우에는 Call By reference(콜 바이 레퍼런스) 라고 부른다.


댓글