#include <stdio.h>
#include <conio.h>
void fun1();
void fun2();
void fun3();
void fun4();
void fun5();
int main()
{
fun5();
return 0;
}
//함수의 이름은 주소이다.
void fun1()
{
printf("%d : 0x%p\n", main, main);
}
void foo() { printf("foo()\n"); }
void woo(int n, char ch) { printf("%d : %c\n", n, ch); }
int goo(char * str) { printf("%s\n", str); return sizeof(str); }
//함수 포인터 : 함수를 저장하는 포인터(함수의 주소를 저장)
void fun2()
{
// void(*f1)() = foo;
// foo(); // 함수의 주소로 이동하라.
// f1();
// void(*f2)(int, char);
// f2 = woo;
// woo(10, 'a'); f2(20, 'b');
int(*p3)(char*);
p3 = goo;
printf("%d\n", p3("문자열전달"));
}
//사용예1) 함수 포인터의 인자 전달
int add(int n1, int n2) { return n1 + n2; }
int sub(int n1, int n2) { return n1 - n2; }
int fun_exam(int num1, int num2, int(*f)(int, int))
{
int ret = f(num1, num2);
return ret;
}
void fun3()
{
int ret = fun_exam(10, 20, sub);
printf("%d\n", ret);
}
//사용예2 : 함수 포인터 저장 배열
void insert() { printf("insert\n"); }
void select() { printf("select\n"); }
void update() { printf("update\n"); }
void delete_() { printf("delete\n"); }
void fun4()
{
char ch;
//void (*)(void)
void(*arr[4]) (void) = { insert, select, update, delete_ };
// arr[0](); // == insert()
while (1)
{
printf("[1]insert [2]select [3]update [4]delete\n");
printf("[5]exit\n");
ch = _getch();
//'1' : 49
if (ch == '5')
return;
arr[ch - '1'](); // 함수 호출
/*
switch (ch)
{
case '1': insert(); break;
case '2': select(); break;
case '3': update(); break;
case '4': delete(); break;
case '5': return;
}
*/
}
}
//typedef : 타입을 정의하겠다.
// 새로운 타입을 만드는것이 아니라
// 존재하는 타입의 다른 이름을 생성하는 것
typedef unsigned int uint;
int max(int n1, int n2) { return (n1 > n2) ? n1 : n2; }
typedef int(*FUN)(int, int); //FUN : type 이름
void fun5()
{
unsigned int num;
uint num1;
int(*f1)(int, int); f1 = max;
printf("%d\n", max(10, 20));
FUN f2; f2 = max;
printf("%d\n", max(10, 20));
}
댓글