#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 |
댓글