C语言自学系列五_函数指针的定义与应用

什么是函数指针

函数指针如字面表达一样,是指的指向函数的指针。它的用处可以说很广了,在我认知和学习到的有2种用法,一是直接调用 如 function(a[i]) 其实是 (*function)(a[i]),的缩写。第二种是 function(function2)类似于php中的依赖注入(本质差别很大,只是举个例子)。作为phper的我了解到这的时候可以说是耳目一新。。。感觉自己有点low

声明一个函数指针

1
char** (*function_name)(char*,int)
返回类型 指针变量 参数类型
char** (*function_name) (char*,int)

#使用

函数指针就这点东西,怎么说呢。使用出真像吧。在下面的演示中比较重要的几个知识点

  • 定义一个函数指针
  • 使用一个函数指针
  • 函数中 void指针(void*)的应用
  • scanf

使用一个 void指针

void* scores_a

int a = * (int*) scores_a;
定义数据类型 解引用 强制转换为数组指针 形参
注:函数指针数组后面另外写时间应该不够,明天新开文章单独举例。

题目一

创建一个list有各个女生的爱好,身材,年龄。我们根据男生的择偶标准匹配出最满足条件的女生

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
* 一个人物结构体
*/
typedef struct girls
{
char *name;
char *like;
unsigned int old;
unsigned int height;
struct girls *next;
} girls;

/**
* 链表
* @param name 姓名
* @param like 爱好
* @param old 年龄
* @param height 身高
* @return
*/
girls* create(char *name, char *like, int old, int height)
{

girls *i = malloc(sizeof(girls));
i->name = strdup(name);
i->like = strdup(like);
i->old = old;
i->height = height;
i->next = NULL;
printf("【成功】录入%s个人信息\n",i->name);
return i;
}



/**
* 录入人员信息
* @return
*/
girls* entry()
{

char name[10],like[10];
int c,old,height,exit;

girls *start = NULL;//起始
girls *next = NULL;//下一个节点
girls *i = NULL;//上一个节点

printf("请按照格式录入人员信息: 姓名 爱好 年龄 身高 \n");
printf("--------------------------------- \n");

while (1){

i = next;

scanf("%s%s%d%d",name,like,&old,&height);


next = create(name,like,old,height);



printf("继续录入请输入【1】停止请出入【2】 \n");
scanf("%d",&exit);

if(start == NULL){
start = next;
}

if(i != NULL){
i->next = next;
}


if(exit == 2){
printf("录入完成 \n");
break;
}

}

return start;

}

/**
* 喜欢读书的小姐姐
* @param like
* @return
*/
int like_book(char *like)
{

if(strstr(like,"读书")){
printf("66666");
return 1;
}else{
return 0;
}
}

/**
* 递归链表
* @param start
*/
void display(girls *start, int (*match)(char*)){

girls *i = start;

for (;i!= NULL; i=i->next) {

if(match(i->like) == 1){
printf("姓名: %s 爱好:%s 年龄:%d she%d \n",i->name,i->like,i->old,i->height);
}

}

return;

}

int main()
{

girls *list = entry();
display(list,like_book);

return 0;
}

题目二

使用C标准函数库qsort实现数组的升序降序,长方形的面积排序

先介绍下 qsort

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

/**
* 降序
* @param scores_a
* @param scores_b
* @return
*/
int desc(const void* scores_a, const void* scores_b)
{
int a = *(int*)scores_a;//强转为整数指针
int b = *(int*)scores_b;
return b-a;
}

/**
* 升序
* @param scores_a
* @param scores_b
* @return
*/
int asc(const void* scores_a, const void* scores_b)
{
int a = *(int*)scores_a;//强转为整数指针
int b = *(int*)scores_b;
return a-b;
}

int main()
{
int scores[] = {10,2,4,5,6,7,8,9,0};
int cnt = sizeof(scores)/sizeof(scores[0]);

qsort(scores, cnt, sizeof(scores[0]), desc);

for (int i = 0; i < cnt; ++i) {
printf("%d \n",scores[i]);
}

printf("----------------------\n");
qsort(scores, cnt, sizeof(scores[0]), asc);

for (int i = 0; i < cnt; ++i) {
printf("%d \n",scores[i]);
}

return 0;
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~