-
[C언어] 포인터_call by value, call by address의 원리와 차이도쿄/개발 2023. 1. 31. 00:59
C언어 1강. Call by Value 와 Call by Address
Call by Value ( 값 전달 )
void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } int main(void) { int a = 50; int b = 100; swap(a, b); printf("a = %d, b = %d", a, b); return 0; }
결과 :
a = 50, b = 100
swap() 함수를 통해 a와 b의 값을 바꾼 것 같은데, 결과적으로 값은 바뀌지 않았다.
그 이유는 swap() 함수에 값(value)을 넘겨준 인수 a와 b는 원본, 값을 넘겨받은 매개변수 x와 y는 복사본이 되는 셈이기 때문이다. 복사본에는 무슨 짓을 해도 원본에는 아무런 영향이 없는 것처럼, a와 b의 값은 그대로 유지되는 것이다.
함수의 기본적인 인수 전달은 복사 원리이고, 바로 call by value가 복사본이 생성되는 원리와 같다.
Call by Address ( 주소 전달 )
void swap(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; } int main(void) { int a = 50; int b = 100; swap(&a, &b); printf("a = %d, b = %d", a, b); return 0; }
결과 :
a = 100, b = 50
이번에는 swap() 함수를 통해 두 값이 변경되었다.
그 이유는 swap() 함수에 두 수의 주소(&)를 넘겨주었고, 주소를 넘겨받은 매개변수는 포인터(*)이기 때문이다.
즉, 다음과 같이 외워두면 헷갈릴 일이 없다.
& : 주소 연산자 * : 주소값을 받는 변수 포인터 x = &a *x (x가 가리키는 값) = a x는 a의 주소 *x는 a b의 경우도 마찬가지다. b의 주소를 y라는 포인터가 가리키고 있고, *y는 b의 값 자체(100)을 말한다.
인수로는 변수의 주소(&)를 넘겨주고, 매개변수로는 주소를 받을 수 있는 포인터(*)를 사용하는 방식, 이것이 Call by Address이다. 함수를 통해 전달하는 인수가 함수 내의 식대로 변경되길 바란다면 call by address를 사용하는 것이 맞다.
반응형'도쿄 > 개발' 카테고리의 다른 글
React기초 정리 (0) 2023.10.21 React_기초 정리 1편 (useState, modal, sort 메소드, like 구현) (0) 2023.10.20 [C언어] 포인터 _ 1차원 배열 완벽 정리 (0) 2023.01.31