c언어 기본서를 볼때 중간 즈음 가면 call by value 와 call by reference 라는 내용이 나옴니다.
개념이야 다들 잘 이해 하셨을텐데 이걸 c에 적용 하면 햇갈리기 시작 합니다.
왜 냐면 여기서 부터 포인터가 시작 되니까요..
흔히 값에 의한 호출 의 경우
func(int a);
같은 형태로 선언이 되고
참조에 의한 호출의 경우
func ( int * a);
라고 선언 합니다.
제생각 에서는 여기서 부터 무언가 설명이 잘못 되었다 생각 합니다.
c언어 에서는 참조에 의한 호출을 지원하지 않습니다.
무슨 소리냐면
func(int * a)는
정수를 인자로 하는 a의 참조를 인자를 받는다 라기 보다는
그냥 단지 정수형 포인터의 주소 값을 인자로 받는다 가 맞습니다.
실제 함수가 호출될때 저 함수에게 주소값이 복사 되어 넘어 간다 이검니다.
call by reference를 위장한 call by value입니다.
java 같은 언어의 경우 클래스를 인자로 받을 경우
참조에 의한 함수 호출을 잘 구현 해주고 있습니다.
func_java(class_A c)
{
c.func1(); // 그냥 인자호 class c를 받았지만 사용 할때는 '.'연산자로 바로 접근 해서 내부 요소를 사용 할수 있죠.
c.func2(); // 그냥 이게 클래스 라면 그냥 어디서 불러재끼던 클래스가 메모리 어디에 짱박혀 있던 상관 없는 검니다.
}
그렇지만 C 에서는
func(class_A * c)
{
c->func1(); // 일단 인자 자체도 포인터로 받아야 하며 내부 요소 접근도 '.'이 아니라 포인터 관련 연산자인'->' 를 사용 해야 합니다.
c->func2();
}
여러분 이렇게 주입식 교육이 무서운 검니다.