달력

5

« 2024/5 »

  • 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
2015. 11. 24. 20:29

함수 포인터 프로그래밍/C언어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)(intint= NULL;
 
    pFunc = add;
    sum = pFunc(1662);
    //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



:
Posted by youjin.A