C语言中的函数指针

函数名本质就是一个函数指针。
它是一个指向函数的地址。

函数指针的定义

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
* 函数指针和指针函数的区别:
* 函数指针:指向了函数的指针。
* 指针函数:函数返回至是指针的函数。
*/


static void func(int a, char c) {
printf("Aaa");
}

static void test01() {
// 先定义出函数类型,再通过类型定义函数指针。
typedef void (FUNC_TYPE)(int, char);

FUNC_TYPE *pFunc = func;

pFunc(10, 'a');

}

static void test02() {
// 先定义出函数指针类型,再通过类型定义函数指针。
typedef void (*FUNC_TYPE)(int, char);

FUNC_TYPE pFunc = func;

pFunc(10, 'a');

}

static void test03() {
// 直接定义函数指针变量。
void (*pFunc)(int, char) = func;

pFunc(10, 'a');

}

static void func1() {
printf("aaa");
}

static void func2() {
printf("bbb");
}

static void func3() {
printf("ccc");
}

/**
* 一次性调用多个相同返回值,相同形参的函数
*/
static void test04() {
void (*pFuncArr[3])();

pFuncArr[0] = func1;
pFuncArr[1] = func2;
pFuncArr[2] = func3;

for (int i = 0; i < 3; i++) {
pFuncArr[i]();
puts("");

}
}
/**
*
* @param argc
* @param argv
* @return
*/
int main(int argc, char *argv[]) {

// test01();
// test02();
// test03();
test04();

return 0;
}

函数指针作函数返回值

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


static void printTest(void *data, void(*print)(void *)){
printf("打印调用:");
print(data);

}


static void printInt(void *data){

int *pData = data;

printf("%d\n", *pData);

}


static void test01(){

int a = 10;


printInt(&a);

// 回调函数
printTest(&a, printInt);

}


typedef struct Person{
char name[100];
int age;
} per;

static void printPerson(void *data){

per *person = data;

printf("%s, %d\n", person->name, person->age);


}

static void test02(){
per person = {"abc", 10};

printPerson(&person);

printTest(&person, &printPerson);

}

int main(void) {


// test01();
test02();


return 0;
}

回调函数小例子:打印任意类型的数组

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 打印任意类型的数组

static void printArray(void *pArray, int lenth, int elementSize, void (*print)(void *)) {


char *p = pArray;
for (int i = 0; i < lenth; i++) {

char *elementAddress = p + elementSize * i;

print(elementAddress);

}


}

// 打印int类型数组回调函数实现
static void printIntArr(void *data) {

int *pArr = data;

printf("%d\n", *pArr);

}


// 打印int类型数组
static void test01() {

int arr[6] = {1, 2, 3, 4, 5, 6};

int arrLen = sizeof(arr) / sizeof(arr[0]);

printArray(arr, arrLen, 4, printIntArr);

}

typedef struct _PEOPLE {
char name[64];
int age;

} pp;


static void printPeople(void *data) {

pp *p = data;

printf("%s, %d\n", p->name, p->age);

}

static void test02() {

pp p[3] = {
{"aaa", 10},
{"bbb", 20},
{"ccc", 30}
};

int pSize = sizeof(p) / sizeof(pp);

printArray(p, pSize, sizeof(pp), printPeople);

}


int main(int argc, char *argv[]) {

test01();
test02();


return 0;
}