Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]

C call by value , call by reference

2010. 6. 11. 23:58programming/c

728x90

C에서는 cally by value 밖에 없다고 한다.
간혹 call by reference 도 있다고 하는데 그건 단지 흉내만 낸 것일 뿐이라고 하는데 무엇일까...?
일단 스크랩은 해봤는데 좀 더 알아보고 다시 포스팅 해야겠음..


#include <stdio.h>
//void swap(int a, int b); Call By Value
void swap(int *a, int *b); //Call By reference

int main()
{
  int num1=10;
  int num2=20;


  swap(&num1,&num2); //Call By Value

  //swap(&num1,&num2); //Call By reference
  //printf("Call By Value 스왑을 한 결과 : num1=%d, num2=%d\n",num1,num2);
  printf("Call By reference 스왑을 한 결과 : num1=%d, num2=%d\n",num1,num2);

}
/*
//Call by Value 스왑 함수!
void swap(int a, int b)
{
  int temp;
  temp = a;
  a = b;
  b = temp;
}
*/

//Call by Refernce 스왑 함수!!
void swap(int *a, int *b)
{
   int temp;
   temp = *a;
   *a = *b;
   *b = temp;
}


======================================================================================================


C에서의 함수 호출은 항상 call by value입니다. 포인터를 써서 call by reference의
효과를 낼 뿐입니다. 함수 인자로 쓰인 포인터 변수 자체가 복사되어 넘겨진다는 점을
생각해 보세요.

다만 call by value 를 call by reference 처럼 보이게 만든것이 reference 입니다..
엄격하게 call by reference와 call by value를 구분하려면...

void func(int value[3])
{
    value[0] = value[1] = value[2] = 0;
}

int value[3] = { 1, 1, 1 };
func(value);후에 value[3] 의 값은 [1,1,1] 이어야만 합니다.
보기에 call by value 처럼 보이기 때문이죠.
보다 정확하게 call by reference를 정의하려면.
func의 type이 "void func(int& value[3])" 이 되어야겠죠.

======================================================================================================

우리는 세상을 살다보면 흔히 오류를 범하곤 합니다. 범위확대의 오류등이 여기에 속할 수 있죠. 그런데 C 에서 웹 서핑중 하나의 오류를 발견했습니다. 포인터를 전달하여 함수를 호출할 때 흔히 Call By Reference 라고 부르더군요. 잘못되었는데 왜 이렇게 부를까라고 생각이 들었습니다. 그리고 부랴부랴 검색을 해봤더니 많은 곳에서 그렇게 지칭하고 있었습니다.
  알고보면 실제로 C 언어에서는 Call By Reference 라는 것을 지원하고 있지 않습니다. 다만 Pointer 를 이용한 Call By Value 를 통하여 Call By Reference 를 흉내내는 것 뿐이죠. 다만 C 에서 지원하지 않는 Reference 문법을 C++ 에서는 & 를 이용하여 지원하고 있습니다.

PointerReference.cpp (Language : cpp)
  1. int swap( int *a, int *b );
  2. int swap( int &a, int &b );


  위 함수의 차이가 무엇일까요?? 밑 함수는 C++ 에서 지원하는 Reference 문법입니다. 고로 호출시 int a = 10; 인 상태에서 swap( a, a ) 이렇게 호출을 하고, swap 함수 안에서 a에 대해서 값을 변경하게 되면 즉각적으로 a = 10; 에 대한 값이 변경되게 됩니다.
  그렇다면 위의 swap( int *a, int *b );에 대하여 swap( &a, &a ); 이렇게 호출을 한다면 어떻게 될까요?? 이 것은 단순한 변수로 생각할 수 있습니다. 왜냐구요? swap 함수안에서 a 에 대한 값을 변경하기만 해보시죠.

Pointer.cpp (Language : cpp)
  1. int swap( int *a, int *b )
  2. {
  3.     b = NULL;
  4.     return *a;
  5. }


  컴파일 시에는 아무런 문제가 발생하지 않습니다. 다만 b 에 대하여 역참조를 실시할 경우 Memory Access Violation이 발생하겠죠. a 와 b 가 그저 단순한 Pointer 변수라는 것에 대하여 생각이 드시나요?? 알고 계시는 분이 많으시겠지만, int *a 라는 것은 단순한 Pointer 변수이기 때문에 바로 Call By Value 를 * 연산자를 통한 역참조로 Call By Reference 를 흉내내는 것입니다.
  뭔가 지지부진하고 현실상에서 중요하지 않은 옛날 옛적의 이야기일 수도 있지만 나름 중요하다고 느꼈기 때문에 포스팅을 해봅니다.

출처 : http://www.filewiki.net/tc/entry/%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-%EC%98%A4%EB%A5%98-Call-By-Reference-in-C

728x90