매개변수 전달 방식


 매개변수란, 함수에 전달된 값을 저장하고, 함수 안에서만 사용하도록 선언되어 있는 변수로 앞에서도 공부 한 적이 있습니다. 매개변수 전달방식에는 값 전달 방식(Call by Value)과 참조 전달 방식(Call by Reference)이 있습니다.


- 값 전달 방식(Call by Value)

 값 전달 방식은 함수를 호출할 경우 메인 함수의 변수를 인자로 호출한 함수에 전달하고, 호출한 함수의 매개변수에 메인 함수의 변수 값을 복사하는 방식입니다. 즉, 같은 변수 x를 선언하고 복사했을때, 같은 x지만 메인 함수의 변수와 호출한 함수의 매개변수는 서로 다른 변수입니다. 아래와 같은 코드를 작성했을 때 x의 값은 몇이나올까요?

------------------------------------------------------------------------------------------

#include <stdio.h>


add(int x);


int main()

{

int x = 10;

add(x);

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

}


add(int x)

{

x = x + 1;

}

------------------------------------------------------------------------------------------

 main 함수의 x의 값인 10을 add함수에 매개변수 x에 복사합니다. 그리고 x값을 1증가 시킵니다. 하지만, add함수의 x와 main함수의 변수는 다르므로, main함수에서의 x는 그대로 10이 출력됩니다.

 다음과 같이 변수의 이름을 서로 다르게 바꿔도 main함수의 변수와, add함수의 매개변수는 다르므로 위의 코드와 결과가 같습니다.

------------------------------------------------------------------------------------------

#include <stdio.h>


add(int a);


int main()

{

int x = 10;

add(x);

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

}


add(int a)

{

a = a + 1;

}

------------------------------------------------------------------------------------------


- 참조 전달 방식(Call by Reference)

 참조 전달방식은 함수의 매개변수에 참조 값을 전달하는 방식으로 함수가 참조를 받을 수 있게 *를 붙이고, 함수를 호출하는 곳에서 변수에 &를 붙입니다.
 아래의 코드를 실행하면 위코드와 같이 10이 나올까요?

------------------------------------------------------------------------------------------

#include <stdio.h>


add(int *a);


int main()

{

int x = 10;

add(&x);

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

}


add(int *a)

{

*a = *a + 1;

}

------------------------------------------------------------------------------------------

 결과는 11이 출력됩니다. 참조 전달 방식은 값을 참조하기때문에 main 함수의 x와 *a가 같은값이됩니다.


 참조 전달 방식을 이용해 입력한 두 값을 바꾸는 코드를 작성해 봤습니다.

------------------------------------------------------------------------------------------

#include <stdio.h>
#pragma warning(disable:4996)

int change(int *x, int *y); // 참조 전달을 위해 변수앞에 *를 붙여줍니다.

int main()
{
int a, b;
printf("입력하는 두 값을 바꿔줍니다.\n");
printf("a 입력 : ");
scanf("%d", &a);
printf("b 입력 : ");
scanf("%d", &b);
printf("바꾸기 전 a : %d, b : %d\n", a, b);
change(&a, &b); // 참조 전달을위해 변수앞에 &를 붙여줍니다.
printf("바꾼 후   a : %d, b : %d\n", a, b);
}

int change(int *x, int *y)
{
int temp; 
temp = *x; // temp에 x값을 저장해놓고 
*x = *y;     // x값에는 y값을 넣고
*y = temp; // y값에는 x값을 저장해놓은 temp의 값을 넣어줍니다.
}

------------------------------------------------------------------------------------------

위 코드의 결과는 다음 그림과 같습니다.


* 출처 : 한국기술교육대학교 온라인평생교육원 C 프로그래밍_2 

          스타일 C프로그래밍 저.김종훈,김종진 출.WellBook




'언어 > C' 카테고리의 다른 글

[C] 배열  (0) 2016.12.23
[C] 디버깅  (0) 2016.12.21
[C] 함수(2)  (0) 2016.12.20
[C] 함수(1)  (0) 2016.12.20
[C] 기타 제어문  (0) 2016.12.19

+ Recent posts