3 - 3 함수_함수 호출 방법

728x90
반응형

프로그래밍 교육 방법

 

 

 - 계속 무언가를 호출하는 형태

 

이때 swap( ) 이라는 함수를 어떻게 만들어야 할까?

더 생각 하기 : 다른 함수를 통해서 두 개의 변수 값을 서로 바꾸려면?

  • main 함수에 있는 변수 두 개의 값을 정렬을 하기 위해 서로 바꾸고 싶은데 자주 사용되는 기능이므로(main에 두면 지저분해지니까) 함수를 만들어서 호출하고 싶다면?

문제 해결 하기

  • main안에서 변수 값을 temp변수를 사용하여 서로 변경하면 바뀌지만, 다른 함수로 두 변수 값을 call by value 보내서 바꾼다면 지역 변수 특성상 main 함수 영역에 있는 변수 값을 두 개 모두 바꿀 수 없음(return은 1개 값만 가지고 올 수 있으므로)

 

그렇다면 다른 방법을 찾아보자.

함수 호출 방법 : 주소에 의한 호출(call by address)

  • 해결 방법
    • main함수에 있는 변수의 주소값을 가지고 swap()함수를 호출하면 swap()함수에서 main함수의 변수 값을 바꿀 수 있음(이럴때 포인터 변수 사용)
    • 바꾸기 위해서는 역참조 연산자를 사용해야 함

  • 포인터도 변수이다. 변수는 저장 공간인데 여기서의 변수는 특수해서 주소를 값으로 가지는 변수라는 것.
  • 일반 변수와 차별화를 두기 위해 포인터 변수를 선언할때에는 변수 앞이나 자료형 뒤에 * 를 붙이게 된다. 그래서 포인터 변수를 선언하는 방법은 intp, intq처럼 한다.
  • 포인터변수는 주소값만 값으로 가지기에 .. &는 주소를 가리키는 의미이므로 intp에 a의 주소값을 넣고싶다면 intp = &a를 하면 된다.
  • 포인터변수 P는 내려와서는 * 가 필요 없다.
  • 근데 왜 주소를 넣을까? 이는 나중에 설명한다.
  • 주소를 넘긴 후에 내가 정말 바꾸고싶은 것은 주소가 아니라 main의 a에 있는 값을 수정하고싶다면? 그럴때 역참조 연산자를 사용한다.
    포인터가 주소를 가지려면 * 가 없다. 포인터 변수 앞에 * 를 넣으면 얘가 가리키는 a에 가서 값을 바꿀 수 있는 영향력을 주게 된다.

중요!

 

함수 호출 예제 sum(), swap()

#include<stdio.h>
int sum(int a, int b); // 함수 원형
void swap(int *p, int *q); // 함수 원형

int main(void){
int a, b, total;
printf("Input two integers : ");
scanf("%d%d", &a, &b); // 10 20

printf("a: %d, b: %d \n", a, b);
total = sum(a, b); // call by value

printf("** sum function call ** \n");
printf("%d + %d = %d \n", a, b, total);

swap(&a, &b); // call by address
// 주소를 넣어서 보낸다.

printf("** swap function call ** \n");
printf("a: %d, b: %d \n", a, b); // 20 10

return 0;
}

int sum(int a, int b){
int total;
total = a + b;
return total;
}

// swap은 sum과 달리 return값이 없으므로 앞부분이 void가 된다.
// 주소를 받을 수 있는 포인터 변수 int *p, *q가 있다.
void swap(int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
// return은 없다. 단지 위의 세 줄을 가지고 main의 값이 바뀐다.
}
++++++++++ console창 결과 값 ++++++++++
Input two integers : 10 20
a: 10, b: 20
** sum function call **
10 + 20 = 30
** swap function call **
a: 20, b: 10

 

요약

  • 값에 의한 호출
  • 주소에 의한 호출
    • 포인터 변수
    • 역참조 연산자(deference operator)
728x90
반응형