프로그래밍[Univ]/C언어

[C언어] 함수포인터

Cloud Travel 2008. 12. 18. 12:37

1. 선언 및 사용
 1) 선언
   return type ( * function name ) ( variable type1, variable type2, ... );
   ex) double (*fun) (double,double);
    > fun이라는 이름을 가지고, double변수를 두 개를 가질 수 있는 함수 포인터

 2) 사용
  function pointer = function;
  ex)
   #include<stdio.h>
   int puls(int x, int y) {
        return x+y;
   }
   int (*fun)(int x, int y);
   main() {
      fun = plus;
      printf("%d\n",fun(2,3));
   }

2. void type변수 다루기
 
1) 변수 타입을 변경하여 다루기
 #include <stdio.h>
 int igreater(void *i, void *j){
      if (*((int*)i) > *((int*)j)) {
      return 1;
     }
     else return 0;
 }
 int main(){
     int i=3;
     int k=5;
     if (igreater(&i, &k))
         printf("i 가 크다.\n");
     else
         printf("j 가 크다.\n");
 }
 
 여기서 중점으로 볼 곳은 int igreater(void *i, void *j)가
 *((int *)i),*((int *)j)로 변화하는 것이다.
 igreater에서는 void로 받은 변수를 int로 변환시켜서 사용하는 것이다.
 문법을 잘 살펴봐야한다. 
 *((type *)name)  > name의 변수를 type크기로 동적할당을 한 후 포인터로 선언한다.
 ex )
  *((int *)i) > i를 int의 크기로 동적할당 한 후 포인터로 정한다.

 2) 변수를 1byte(char)씩 사용하기
 #include<stdio.h>
 int swap(void *i, void *j, int size)
 {
     int k;
     char *p, *q;
     p = i;
     q = j;
     char temp;
     for ( k = 0 ; k < size ; k++ , *p++, *q++){
         temp = *p;
         *p = *q;
         *q = temp;
     }
 } 
 편의상 메인함수는 쓰지 않았다.
 위의 소스는 각 변수의 size를 알 때 뒤바꺼 주는 함수이다.
 main에서 넘겨 줄 때 변수의 크기를 같이 넘겨주어야 한다. 왜냐하면 크기만큼 뒤바꺼 줘야하기 때문이다.
 여기서 말할 중점인 char *p, char *q를 선언하여 i와 j를 1byte씩 사용하는 것이다.
 어떠한 변수가 오더라도, 그 변수의 크기를 알 고 있다면, char타입을 사용하여 변수를 다룰 수 있다.