■함수포인터와 void 포인터



# void 포인터


<한 줄 요약>

어떤 자료형이든 가능! 그러나 casting(강제 형변환) 해서 써야만 한다.


즉, void 포인터를 사용하면 유동적으로 사용할 수 있고 함수의 경우 자료형에 따라 만들 함수를 줄여줄 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <string.h>
 
void swap(char *type, void *ap, void *bp);
 
int main(void)
{
    int age1, age2;
    double height1, height2;
 
    scanf("%d%lf"&age1, &height1);
 
    scanf("%d%lf"&age2, &height2);
 
    swap("int"&age1, &age2);
    swap("double"&height1, &height2);
 
    return 0;
}
 
void swap(char *type, void *ap, void *bp)
{
    int temp;
    double dtemp;
 
    if(strcmp(type, "int"== 0)
    {
        temp = *(int *)ap;
        *(int *)ap = *(int *)bp;
        *(int *)bp = temp;
    }
    if(strcmp(type, "double"== 0)
    {
        dtemp = *(double *)ap;
        *(double *)ap = *(double *)bp;
        *(double *)bp = dtemp;
    }
}
cs

#함수 포인터
기능은 다르지만 형태가 같은 함수를 선택적으로 호출할 때 함수 포인터를 쓴다.

자세히는 잘 모르겠지만 뭔가 묶어놓는(?) 느낌이 든다.

폴더 안에 폴더를 만드는 것처럼 이해했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<stdio.h>
int sum(int,int);
int sub(int,int);
double mul(double,double);
double div(double,double);
 
int func1(int (*fp)(int,int));
double func2(double (*fp)(double,double));
int main()
{
    printf("%d\n",func1(sum));    
    printf("%lf\n",func2(mul));
    return 0;
}
 
int func1(int (*fp)(int,int))
{
    int a,b;
    printf("정수 입력 :"); 
    scanf("%d%d",&a,&b);
    
    return fp(a,b);
}
 
double func2(double (*fp)(double,double))
{
    double a,b;
    printf("정수 입력 :"); 
    scanf("%lf%lf",&a,&b);
    
    return fp(a,b);
}
 
int sum(int a,int b)
{
    return a+b;
}
 
int sub(int a,int b)
{
    return a-b;
}
 
double mul(double a,double b)
{
    return a*b;
}
double div(double a,double b)
{
    return a/b;
}
cs
이렇게 sum,sub,mul,div라는 기능을 하는 주요 함수가 있고
sum,sub는 int형으로 func1을 통해서 접근하고

mul,div는 double형으로 func2를 통해서 접근하여 사용한다.



함수포인터는 초기화 할 때 매개변수의 자료형과 return의 자료형이 같아야 한다.



+ Recent posts