본문 바로가기
프로그래밍

함수 및 포인터

by 건우아빠유리남편 2009. 7. 19.
반응형

#include <stdio.h>

// 10 page => 복잡한 표현식. -> C에서 복잡한것은 배열 포인터 아니면 함수 포인터 밖에 없다.
// int (*p)[2]; //배열 포인터
// void (*f)(int); //함수 포인터 (정확한 모양을 어딘가에 적어 놓으세요..)
// fp1은 ?

// 절대 아래 표현은 사용하면 안된다 !!! -> 하지만 해석할줄은 알아야 !!
// 실제로는 typedef로 해야 한다 !!
// 숙제 10 page 4가지 표현을 모두 typedef 바꾸어서 만들어 보세요 !!.
void*(*(*fp1)(int)[10];

// 1. symbol을 찾아라 !  -> fp1

// 2. symbol 뒤가 "(" ==>  무조건 함수.
//      "[" ==> 무조건 배열.
//      ")[" ==> 무조건 배열 포인터.
//      ")(" ==> 무조건 함수 포인터.  

// 3. 해석 가능한 부분을 제거 해 본다 !! => 나머지를 해석한다.

 


// 함수 포인터
// 1. void(*f)(int)  모양 외우기 !!
// 2. 함수포인터를 인자로 가지는 함수 - 자주 사용 하는 기법. 예제는 좀 있다가 나옴
// 3. 함수 포인터를 리턴 하는 함수 -> 자주 사용되지는 않는 기법.
// 4. typedef 로 함수 포인터 type 만들기

typedef void (*PF)(int);


void foo(int a)
{
 printf("foo : %d \n", a );
}


void goo( void(*f)(int ) ) //해석 해보세요..
{       //함수 포인터를 인자로 가지는 함수
 PF f = foo;  // 결국 void(*f)(int) = foo 와 동일
 f(10);
}

 

void (*f)(int);  // 1. 함수 포인터 변수 모양을 먼저 생각.
     // 2. 변수 이름 (f)  대신에.. -> 함수 이름()
void (* goo() )(int);
//?? goo() 
{
 return foo;  //함수 주소를 리턴하는 함수.
}

void main()
{
 goo()(5); // 결국 foo(5)
}

 

/*
void main()
{
 goo( foo );

 void(*f)(int); // f는 함수의 주수를 담는 변수 이다 . - 반드시 외워야 합니다..!!
 
 f = foo; // 주소 대입..

 f(10); // 결국 foo(10) 과 동일.

 (*f)(10); // f(10) 과 결국 동일.


 foo ( 5 );

 print( "%p \n", foo); //? 함수 이름 : 함수 주소..
}
*/




#include <stdio.h>

// 함수포인터 예제

// 컴파일해서 라이브러리로 보관(즉 이진 기계어 코드 형식으로)
typedef int(*Compare)(int, int);

// 결국 qsort()의 원리가 이처럼 함수를 인자로 받아서 sort 한다.

// 알고리즘은 : sort 함수가

// sort 기준은 : 사용자가
void sort(int* x, int sz, Compare cmp)
{
 int i, j, temp;

 for(i=0; i<sz; ++i)
 {
  for(j=i+1; j <sz; ++j)
  { 
   if( cmp( x[i], x[j]) > 0) //외부에서 전달된 함수 다시 호출해서 비교
   {
    temp = x[i];
    x[i] = x[j];
    x[j] = temp;
   }
  }
 }
}
#include <stdlib.h> // for abs()
//-----------------------------------------------
int cmp1(int a, int b)
{
 return abs(b)-abs(a);
}
void main()
{
 int i = 0;
 int y[10] = { 1,3,-6,7,9,10,-2,4,5,9 }; //아무 숫자나 10개 넣으세요

 sort(y, 10, cmp1); // 어떻게 sort할 것인가를 정하기 위해
        // 두 원소를 비교하는 함수를 한개 제공한다.

 for(i=0;i<10; ++i)
 {
  printf("%d ", y[i]);
 }
}

반응형

'프로그래밍' 카테고리의 다른 글

Quick Sort  (0) 2009.07.19
Function Pointer EX  (0) 2009.07.19
Flexible Array  (0) 2009.07.19
Error Handling  (0) 2009.07.19
Dos Compilering & Make Asm  (0) 2009.07.19

댓글