C语言 - 指针 1.5:函数指针 | 指针函数
作者:互联网
函数指针
1 - 函数指针是指向函数的指针变量,本质是一个指针变量。声明格式:int (*maxValue) (int x,)
2 - 函数指针只能指向具有特定特征的函数,要求所有被同一指针所指向的函数必须具有相同的参数和返回值类型。比如 void (*func) ( ) 首先执行的是 (*func),func 是一个指针;紧接着执行 ( ),表明 func 指向的是一个函数;void 则标明这个函数不返回任何值
3 - 代码示例
① 如何使用函数指针
1 #include <stdio.h> 2 #include <string.h> 3 4 // 加 5 int sumValue(int x,int y){ 6 int sum =0; 7 sum = x+y; 8 return sum; 9 } 10 11 // 较大值 12 int maxValue(int a,int b){ 13 return a > b ? a : b; 14 } 15 16 // 遍历求和 17 int number (int x){ 18 19 int sum=0; 20 for (int i=0; i<x; i++) { 21 sum += i; 22 } 23 return sum ; 24 } 25 26 // 平方 27 int squareValue (int y){ 28 int square =0; 29 square = y*y; 30 return square; 31 } 32 int main(int argc, const char * argv[]) { 33 34 // 加 35 int (*p) (int,int)= sumValue;// 函数指针 p 36 printf("%d \n",sumValue(10, 20));// 方式 1 37 printf("%d \n",p(10,20));// 方式 2 38 printf("%d \n",(*p)(10,20));// 方式 3 39 40 printf("%p \n",sumValue); 41 printf("%p \n",p); 42 43 44 // 取较大值 45 p = maxValue;// 函数指针重指向,等价于 p = &maxValue;(取址运算符可以忽略) 46 printf("%d \n",maxValue(10, 20)); 47 printf("%d \n",p(10,20)); 48 printf("%p \n",maxValue); 49 printf("%p \n",p); 50 51 52 // 遍历求和 53 int (*q) (int ) = number; 54 printf("%d \n",number(101)); 55 printf("%d \n",q(101)); 56 57 // 相加或平方 58 int (*point)(int) = NULL; 59 printf("请输入sum或者squ:\n"); 60 char string [20] =" "; 61 scanf("%s",string); 62 if (strcmp(string, "sum")==0) { 63 point = number; 64 }else if(strcmp(string, "squ")==0){ 65 66 point = squareValue; 67 } 68 69 printf("%s的结果为:%d\n",string,point(10)); 70 71 return 0; 72 }
注:C语言 规定函数指示符(即函数名)既不是左值也不是右值,但是 CPP语言 规定函数名属于左值
函数名除了可以作为 sizeof 和取地址 & 的操作数,函数名在表达式中可以自动转换为函数指针类型的右值。所以通过一个函数指针调用所指向的函数不需要在函数指针面前添加操作符号 *
指向函数的指针变量没有自增 ++ 和 自减 – 操作
② 输入学生信息(姓名、年龄、分数),以既定分数为标准将学生信息按照年龄进行升序
1 #include <stdio.h> 2 #include <stdbool.h> 3 #include <stdlib.h> 4 typedef struct student{ 5 6 char name[20];// 姓名 7 float score; // 分数 8 int age; // 年龄 9 10 }Student; 11 12 // 注意这里是指针函数 13 Student *genterStudentsInfo(int count){ 14 // 开辟内存,存储学生信息 15 Student *stus = malloc(sizeof(Student)*count ); 16 for (int i = 0; i < count; i++) { 17 printf("请输入第%d个学生的信息:\n",i+1); 18 printf("姓名 成绩 年纪:\n"); 19 scanf("%s %f %d",(stus+i)->name,&(stus+i)->score,&(stus+i)->age); 20 } 21 return stus; 22 }; 23 24 // 名字后面拼接标记 25 void modifyName(char *name){ 26 strcat(name, "---学霸"); 27 } 28 void Name(char *name){ 29 strcat(name, "---学渣"); 30 } 31 32 // 查找分数:高于指定分数标记为学霸,低于指定分数标记为学渣 33 void searchStudentInfo(Student *stus,int count,float destScore,void(*p)(char*),void(*q)(char*)){ 34 35 for (int i = 0;i< count ;i++) { 36 37 if ((stus+i)->score > destScore) { 38 p((stus+i)->name);// 学霸 39 }else{ 40 q((stus+i)->name);// 学渣 41 } 42 } 43 } 44 45 // 升序 46 bool isAscending(int age1,int age2){ 47 return age1 > age2 ? 1 : 0; 48 } 49 50 // 降序 51 bool isDecending(int age1,int age2){ 52 return age1 < age2 ? 1 : 0; 53 } 54 55 bool(*p) (int,int); 56 typedef bool(*Compare) (int,int); 57 58 // 排序 59 void sortStudentInfo(Student *stus,int count,Compare point){ 60 61 for(int i=0; i<count-1; i++) { 62 for(int j=0; j<count-1-i; j++) { 63 64 if(point ((stus+j)->age,(stus+j+1)->age)){ 65 Student temp = *(stus+j); 66 *(stus+j) = stus[j+1]; 67 *(stus+j+1) = temp; 68 } 69 } 70 } 71 } 72 73 // 打印学生信息 74 void printStudentInfo(Student *stus,int count){ 75 printf("\n----------------------------------\n"); 76 for (int i=0; i<count ; i++) { 77 printf("姓名:%s, 成绩:%.2f,年龄:%d \n",stus[i].name,(stus+i)->score,stus[i].age); 78 } 79 printf("----------------------------------\n"); 80 } 81 82 int main(int argc, const char * argv[]) { 83 84 Student *students = genterStudentsInfo(3); 85 searchStudentInfo(students, 3, 90, modifyName,Name); 86 sortStudentInfo(students, 3, isAscending);// 升序 87 printStudentInfo(students, 3); 88 89 return 0; 90 }
日志打印
指针函数
1 - 简单来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。声明格式:类型标识符 *函数名(参数...); 如:int *fun(int x,int y);
标签:1.5,函数,stus,int,void,Student,函数指针,指针 来源: https://www.cnblogs.com/self-epoch/p/15340445.html