함수 인자로 들어온 값을 복사하여 처리하는 방식이다. 그렇기 때문에 내부에서 값을 변경해도 원본 값은 바뀌지 않는다.
변수의 참조값으로 값을 처리하는 방식이다. 내부에서 값을 변경하면 원본 변수의 값도 바뀐다.
그걸 C언어에서는 포인터를 사용하여 구현할 수도 있다.
#include <stdio.h>void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10, y = 20;
printf("Before swap: x=%d, y=%d\\\\n", x, y);
swap(&x, &y);
printf("After swap: x=%d, y=%d\\\\n", x, y);
return 0;
}
주소값: 메모리 주소를 나타내는 값
참조값: 변수가 지닌 그 값 자체이다. 여기서 참조는 그 값의 주소이다.
아래 코드에서 a와 b는 참조값은 같지만 주소값은 다르다.
안에 들어있는 값(참조값)은 바뀔 수 있는데 그 값의 위치(주소값)은 그대로라는 것이다.
뭐 동적 메모리 할당 같은 경우 주소값도 바뀔 수 있겠다.
int a = 10;
int b = 10;
printf("%d", a == b);// 1
a++;
printf("%d", a);// 11
그렇다면 왜 C언어에는 Call by reference가 없다고 하는 것일까?
아래 swap함수는 포인터a와 포인터b를 인자로 받고 있다.
Call by reference는 인자에 참조를 넘겨야 하는데 그냥 하나의 값(value)으로 ‘복사’해서 넘겼을 뿐이다.
엄밀히 말하면 C언어에는 오직 Call by Value 뿐이 없다고 이야기 하는 것이다.있다고 하더라도 구분용으로 사용한다.
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
C언어 창시자인 데니스 리치도 The Development of the C Language논문에서도 C언어는 Call by value방식만 지원한다고 명시하고 있다.
Call by reference can be simulated in languages that use call by value and don't exactly support call by reference, by making use of references (objects that refer to other objects), such as pointers (objects representing the memory addresses of other objects).