개인공부/C

Call - By

5ddish 2018. 5. 17. 00:32

c언어에서 호출하는 방식의 차이임 


총 3가지가 있음 


1. call by value (값에 의한 호출)

2. call by address (주소에 의한 호출)

3. call by reference ( 참조에 의한 호출)


예제를 통해 하나씩 살펴보자 


1. call by value 

예를들어 다음과 같이 두개의 매계변수를 받아 두 수를 교환하는 프로그램이 있다고 해보자


#include <stdio.h>


void swap(int x, int y)

{

    int tmp;

    tmp = x;

    x = y;

    y = tmp;

}


int main()

{

    int a = 20;

    int b = 30;

    

    swap(a,b);

    

    printf("%d , %d \n", a,b);

}



일케해서 프린트 문 찍으면 바뀔거 같은데 안바뀜 , 그냥 바뀌는건 swap() 함수내에서만 바뀌고 메인에서는 int a = 20; int b = 30 이니까 출력이 20 , 30 걍 일케댐 그럼 어케해야 


하냐 해서 나온게 call by address 임 


2. call by address

위에랑 똑같은 프로그램인데 이번엔 좀 다름 자세히 봐보셈 ㅋ 


#include <stdio.h>


void swap(int *x, int *y)

{

    int tmp;

    tmp = *x;

    *x = *y;

    *y = tmp;

}


int main()

{

    int a = 20;

    int b = 30;

    

    swap(&a,&b);

    

    printf("%d , %d \n", a,b);

}


짜라잔 ! 뭐가 달라졌는지 틀린그림 찾기 해보셈 총 3개임 !

하나. swap 함수에서 매개변수로 받는데 갑자기 *이 붙어버림
둘   . 그리고 swap 함수 내 x , y 앞에도 *이 붙어버림 
셋  . 마지막으로 메인 함수에서 swap 함수 호출할때 넘겨주는 인자값에 & 가 붙어버림 


여기서 알고 가야 할 사실 2개 
포인터에서 변수 앞에 & 가 붙으면 뭐다 ? 주소값
포인터에서 변수 앞에 * 가  붙으면 뭐다 ? 실제값

이해갔지 ? 

바바 만약

#include <stdio.h>


int main()

{

    int a = 20;

    int *p = &a;;

    

    printf("%d\n", a);

    printf("%d\n", &a);

    printf("%d\n", *p);

}



일케 있으면 &a 는 a변수가 메모리에 저장된 메모리 주소값이 나올꺼고 *p 는 20이 나올꺼임 ㅇㅇ 이해 안간다면 포인터 를 다시 공부하셈 (양주종의 코딩스쿨 - 여기 포인터 강의 좋음)

다시 돌아가서 swap(&a, &b) 로 a, b 의 주소값을 매계변수로 넘겨주고 실제 그 값(*x , *y 를 통해) 을 변경해 주기 때문에 저건 바뀌여서 출력됨 ㅇㅇ 

마지막으로 call by reference 이건데 이건 C문법이 아니라 C++ 문법임 

그래서 혹시라도 테스트 해보려면 확장자가 .c  가 아닌 .cpp 환경에서 해야할거임 아마도 ㅇㅇ 

3. call by reference 

#include <stdio.h>


void swap(int &x, int &y)

{

    int tmp;

    tmp = x;

    x = y;

    y = tmp;

}


int main()

{

    int a = 20;

    int b = 30;

    

    swap(a,b);

    

    printf("%d , %d \n", a,b);

}


call by reference 이거는 엄청 간단함 == 편함 == 좋음

그냥 매개변수에다가 & 를 통해 주소값을 참조하게 해줌 call by address 랑 비슷하지만 다름 뭐가 다른진 정확히 설명할수 없지만 머릿속으론 알고있음 

쨋든 이건 call by value 랑 똑같은데 그냥 매개변수에 & 를 통해 주소값을 넘겨줘 버리면 swap 이 댐 ㅇㅇ 굿 


정리 끝