컴퓨터를 공부하고자 마음먹은지 N일차
[205일차]Call by Value, Call by Reference 본문
Call by value, Call by Reference
이것 또한 면접 때 받은 질문 이었다.
두 용어자체를 몰랐기에 대답을 못했지만,
집에 와서 알아보니 자바스크립트의 함수에서 원시값을 매개변수로 받을 때랑,
참조값을 매개변수로 받을 때의 차이를 떠올리면 쉽게 이해할 수 있고 답변할 수 있었던것이었다.
c언어로 주소를 출력하는 코드를 짜보면서 이해해보자.
Call by value
call by value는 직역하자면 값에 의한 호출이다.
뭔말이냐면 매개변수로 받은 인자의 값만 복사해서 그 값을 처리한다.
코드와 그림을 같이 보도록 하자.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> void print_address_and_change_value(int num2){ printf("Value of num2 = %d Address of num2 = %p\n", num2, &num2); num2 = 1; } int main() { int num1 = 0; print_address_and_change_value(num1); printf("Value of num1 = %d Address of num1 = %p", num1, &num1); return 0; } | cs |
위의 코드진행을 보면 메인 함수에서 num1을 선언하고 0을 할당해준다.
이런식으로 num1이 선언되면 우리의 메모리에 num1이라는 이름과 함께
특정 주소에 0이라는 value와 함께 할당된다.
그리고 print_address_and_change_value 라는 함수가 실행 되면서,
호출된 함수인 print_address...함수는 자신의 매개변수를 새로운 주소에다가 할당한다.
그리고 인자로 받는 num1의 value만 복사 해서 할당한다.
그리고 num2의 값을 바꿔보자.
당연히 num2는 값만 복사하기 때문에 num1의 값에 영향을 끼치지않는다.
Call by reference
반면 직역하면 참조에의한 호출은 어떨까?
call by value와는 다르게, 해당 함수는 포인터 변수를 선언해 매개변수로 받는다
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> void print_address_and_change_value(int *num2){ printf("Value of num2 = %d Address of num2 = %p\n", *num2, num2); *num2 = 1; } int main() { int num1 = 0; print_address_and_change_value(&num1); printf("Value of num1 = %d Address of num1 = %p", num1, &num1); return 0; } | cs |
아까와 동일하게 메인 함수에서 num1을 선언하고 0을 할당해준다.
그리고 print_address_and_change_value 함수를 호출하지만,
매개변수로 포인터 변수를 선언해서 주소를 인자로 받아온다.
num1 의 주소값을 넘겨받았기 때문에 혹여 num2의 값을 바꾸면,
주소를 참조하고 있기 때문에 num1의 값을 수정하게 된다.
'🖥C' 카테고리의 다른 글
[38일차](홍정모의따배c)텍스트파일읽기 (0) | 2020.10.16 |
---|---|
[38일차](홍정모의따배c)메뉴만들기 예제 (0) | 2020.10.16 |
[37일차](홍정모의따배c)입력스트림과 숫자 (0) | 2020.10.16 |
[37일차](홍정모의따배c)입력확인하기 (0) | 2020.10.16 |
[35일차](홍정모의따배c)숫자와 문자를 섞어서 입력받기, void함수는 뭐에요? (0) | 2020.10.13 |