프로그래밍/C언어
함수 포인터
youjin.A
2015. 11. 24. 20:29
-함수 포인터(function pointer)
함수의 메모리 주소를 가지는 포인터 변수
-함수 포인터의 선언
만약 함수 포인터 이름에다가 소괄호를 붙이지 않고 다음과 같이 선언하면 무엇을 의미할까?
int* pFunc(int, int)
위 문장은 반환형이 int형 포인터인 함수를 선언한 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> int add(int x, int y) { return x + y; } int main(void) { int sum; int(*pFunc)(int, int) = NULL; pFunc = add; sum = pFunc(16, 62); //sum = (*pFunc)(16, 62); //sum = add(16, 62); //sum = (*add)(16, 62); printf("16 + 62 = %d\n", sum); return 0; } | cs |
-함수 포인터 자료형
함수 포인터를 선언할 때 특정 반환값과 인자를 가지는 함수 포인터를 반복적으로 만들기 귀찮기 때문에, 이것을 자료형으로 아예 만들 수 있다.
-함수 포인터 자료형의 선언
typedef void (*funcName_1)(int);
typedef void funcName_2(int);
둘 다 함수 포인터의 자료형이지만 둘의 차이가 있다.
만약 void temp(int)의 주소값을 전달 받는 다면
funcName_1 fc = temp
는 옳은 문장이지만 funcName_2 fc = temp는 컴파일 에러가 난다. 이를 해결하기 위해서는
funcName_2 * fc = temp;
와 같이 사용해야 한다. 다만 매개변수로 함수의 주소값을 전달 받는 경우에는 *의 생략이 가능하다.
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <stdio.h> #include <stdlib.h> typedef int BTData; typedef struct _bTreeNode { BTData data; struct _bTreeNode* left; struct _bTreeNode* right; }BTreeNode; BTreeNode* MakeBTreeNode(void) { BTreeNode* nd = (BTreeNode*)malloc(sizeof(BTreeNode)); nd->left = NULL; nd->right = NULL; return nd; } BTData GetData(BTreeNode* bt) { return bt->data; } void SetData(BTreeNode* bt, BTData data) { bt->data = data; } BTreeNode* GetLeftSubTree(BTreeNode* bt) { return bt->left; } BTreeNode* GetRightSubTree(BTreeNode* bt) { return bt->right; } void MakeLeftSubTree(BTreeNode* main, BTreeNode* sub) { if (main->left != NULL) free(main->left); main->left = sub; } void MakeRightSubTree(BTreeNode* main, BTreeNode* sub) { if (main->right != NULL) free(main->right); main->right = sub; } typedef void VisitFuncPtr(BTData data); void PreorderTraverse(BTreeNode* bt, VisitFuncPtr action) { if (bt == NULL) return; action(bt->data); PreorderTraverse(bt->left, action); PreorderTraverse(bt->right, action); } void ShowIntData(int data) { printf("%d ", data); } int main(void) { BTreeNode* bt1 = MakeBTreeNode(); BTreeNode* bt2 = MakeBTreeNode(); BTreeNode* bt3 = MakeBTreeNode(); BTreeNode* bt4 = MakeBTreeNode(); SetData(bt1, 1); SetData(bt2, 2); SetData(bt3, 3); SetData(bt4, 4); MakeLeftSubTree(bt1, bt2); MakeRightSubTree(bt1, bt3); MakeLeftSubTree(bt2, bt4); printf("Preorder Traverse: \n"); PreorderTraverse(bt1, ShowIntData); printf("\n"); return 0; } | cs |