Call by Reference, Call by Value

박희령·2024년 1월 14일

42Seoul

목록 보기
5/5
post-thumbnail

Call by value: 값에 의한 호출

Call by Value는 함수 호출 스택에서 매개변수를 저장하는 공간에 인자를 저장하는 방법으로 인자가 함수에게 전달되는 방식이다. 따라서 인자로 넘겨진 값이 변경되어도 그 함수에서만 변경된다.


Call by Reference: 참조에의한 호출

Call by Reference는 Call by Value와 다르게 함수를 넘겨줄 때 메모리의 주소를 넘겨준다. 그렇기에 함수 내부에서 메모리의 주소 값을 통해 값을 조작할 수 있고 이는 함수 밖의 영역에도 영향을 미치게 된다.


예시


a는 값을 인자로 넘겼기 때문에 함수 내부에서만 값이 변해 0이 출력되었고 b는 주소를 인자로 넘겼기 때문에 함수 내부에서 주소를 참조해 변경한 값이 함수 외부에도 적용되어 3이 출력되었다.


문자열에서는 ?

char a[] = "hello"; 이런식으로 문자열을 선언했다면 변수 a는 포인터이다.
함수에서 포인터를 매개변수로 받으면 함수 내부에서는 포인터를 참조해 값을 변경하게 된다.


char *a; 로 선언만 한 변수는?

char a; 로 선언만하고 값을 할당하지 않은 변수를 함수의 인자로 넣어 문자열 조작하는 방식은 조금다르다.
char
a; 로 선언한 변수 a에 malloc을 하게 되면 a는 새로 할당한 곳의 주소값을 갖게 되기 때문에 다르게 처리해줘야된다.

이러한 방식에서는 change함수 내부에서의 a주소와 main함수에서 a의 주소가 다른것을 확인할 수 있고 이는 change함수에서 문자열을 조작하더라도 main함수에서 a에 영향을 주지 않음을 뜻한다.

a를 void change(char **a)로 받아 main함수에서 a의 주소값(&a)를 넘겨주게 되면 change함수 내부에서의 a주소와 main함수에서 a의 주소가 같은것을 확인할 수 있다.

이런식으로 사용하면 char *a;로 선언만 한 변수를 다른함수에서 Call by Reference로 조작할 수 있게된다.


profile
기억하고 싶은 것들을 기록합니다.

0개의 댓글