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 이 댐 ㅇㅇ 굿
정리 끝