■함수포인터와 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는 int형으로 func1을 통해서 접근하고
mul,div는 double형으로 func2를 통해서 접근하여 사용한다.
함수포인터는 초기화 할 때 매개변수의 자료형과 return의 자료형이 같아야 한다.
'C 언어' 카테고리의 다른 글
[C언어_Day8]마방진 + 주민등록번호 검사 (0) | 2018.10.11 |
---|---|
[C언어_Day7]동적 할당 (0) | 2018.10.11 |
[C언어_Day5]명령 인수, 포인터 사용 (0) | 2018.10.11 |
[C언어_Day4]String 예제 (0) | 2018.10.11 |
[C언어_Day3]대소문자 변경 (0) | 2018.10.11 |