(예시 코드는 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; *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 = &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(콜 바이 레퍼런스) 라고 부른다.
'Dev > [C]' 카테고리의 다른 글
[개탱][C][지역변수와 전역변수] (0) | 2018.01.02 |
---|---|
[개탱][C][전처리(preprocessor directives)][헤더파일 중복선언 방지] (0) | 2018.01.02 |
[개탱][C][변수 읽는법][Pointer][Double Pointer][함수 포인터][더블 포인터][포인터] (0) | 2018.01.02 |
[개탱][C][분리 컴파일[Separate compilation]] (0) | 2018.01.02 |
[개탱][C][typedef][Typedef Struct ][사용자 정의 구조체] (0) | 2018.01.02 |