主要内容:函数指针

一、函数指针定义

int  maxValue(int  a,int  b)

{

return   a > b ?

a : b;

}

函数名和数组名一样是地址,存在在代码区

int  maxValue(int  a。int  b)

int  (*p)(int。int)=  NULL

函数指针定义。p是变量,其它是类型(通常没有形參a。b)

p = maxValue(函数指针的使用:赋值函数名)

int  m = p(3,5)(指针可当函数用)

练习:定义两个函数,一个求最大值,一个求和。用户从控制台输入两个整数,在从控制台输入max或sum分别求

3和5的最大值或和,(提示:定义一个函数指针,依据输入内容指向不同的函数。最后一次调用完毕)

int  maxValue ( int a, int  b )    / / 求最大值的函数

{

return  a > b ? a : b;

}

int  sumValue ( int a, int b )     / / 求和的函数

{

return  a + b;

}

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

{

void (*p) (int , int) = NULL;                           / / 定义一个指针变量

int   a  , b;                                                     / / 定义两个须要用的整型变量

printf(" 请输入两个整数: ");                        / / 让用户输入两个整数

scanf(" %d%d ",&a,&b);                               / / 标准的输入函数

printf(" 请输入sum或者max: ");                 / /  让用户输入sum或者max

char  *name = malloc(sizeof(char) * 10);     / /  申请char类型的乘以10的内存空间

scanf(" %s ", name);

/ / 推断用户输入的是sum还是max

if (strcmp(name, " sum ") == 0){

p = sumValue;

}else if (strcmp(name, " max ") == 0){

p = maxValue;

}else {

printf(" 输入错误,失败 ");

}

free (name);        / /  释放内存,一定不能忘

int  result = p(a, b);/ /  定义result接收结果

printf(" %d ", result);/ /  输出结果

}

二、回调函数

函数指针做參数

int  getValue(int  a, int  b, int  (*p)(int , int));

getValue: 函数名

int (*p)(int ,int): 函数指针做getValue函数的參数

int  value = getValue(3, 5, maxValue);(函数调用:getValue函数运行过程中再调用(回调)maxValue)

如图所看到的:

练习:写一函数查找成绩在90分以上的学生,是用回调函数在姓名后面加“高富帅”

typedef  struct {           / /  定义一个结构体

char name[20];

int  age;

float  score;

} Student;

void  printfStudent(Student  *stu, int  count)。

void  printfStudent(Student  *stu, int  count)   / /  声明并编写一个打印结构体数组的函数

{

for(int  i = 0; i < count ; i++){

printf("%s %d %.2f", (stu + i) ->name, (stu + i) ->age, (stu + i) ->score);

}

}

/ / 声明并编写查找90分以上的学生并在姓名后面加“高富帅”

void  changeStudent(Student  *stu, int count,  void (*p)(Student  *));

void  changeStudent(Student  *stu, int count,  void(*p)(Student  *))

{

for (int  i = 0; i < count ; i++){

if ((stu + i) ->score >= 90){

p(stu + i);

}

}

}

void  changeName(Student *stu);

void  changeName(Student *stu)

{

strcat (stu ->name, " 高富帅 ");

}

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

Student  student = {/ / 定义结构体变量

{" 方世玉 ", 26,  92},

{" 令狐冲 ", 30,  89},

{" 韦小宝 ", 27,  99},

{" 花仙子 ", 20,  80},

{" 大教主 ", 24,  80}

};

int  count  = sizeof(student) / sizeof(Student);  / / 求结构体数组的长度

printfStudent(stuent, count); / / 打印没查找前的结构体数组

changeStudent(student, count, changeName); / / 推断是否符合条件90分以上的进行改变

printfStudent(student,  count)  / / 打印查找后的结构体数组

}

三、动态排序

排序需求不定,无法预測的需求变更

void  sortArray(int  *array,  int  count)

{

for (int i = 0; i < count - 1; i++){

for (int j = 0; j < count - 1 - i; j++){

if (条件(需求)) {

交换

}

}

}

}

决定排序方式的重要语句封装成函数在此回调

int 数组动态排序

typedef  BOOL(* PFUNC)(int , int);   / / 为函数指针类型起名为PFUNC

void  sortArray(int  *array, int count , PFUNC  p);  / / 动态函数排序声明

演示样例:

/ / 1:创建一个结构体

typedef  struct {

char  name[20];

int  age;

float  score;

} Student;

/ / 3:打印学生结构体数组的函数

void  printfStudent(Student  *stu,  int  count);

void  printfStudent(Student  *stu,  int  count)

{

for (int  i = 0; i < count; i++){

printf("%s %d %.2f",(stu + i) ->name, (stu + i) ->age,  (stu + i) ->score);

}

printf("\n");

}

/ / 5:写一个函数依据分数从小到大排序

void   paiXuStudent(Student  *stu,  int  count,  BOOL (*PFUNC)(Student  *stu1,  Student  *stu2));

void   paiXuStudent(Student  *stu,  int  count,  BOOL (*PFUNC)(Student  *stu1,  Student  *stu2))

{

for (int  i = 0; i < count - 1; i++){

for (int  j = 0; j < count - 1 - i; j++){

if (PFUNC((stu + j), (stu + j + 1))){

Student  temp;

temp = *(stu + j);

*(stu + j) = *(stu + j + 1);

*(stu + j + 1) = temp;

}

}

}

}

/ / 6:定义一个按分数比較大小的函数

BOOL  biJiaoScore(Student  *stu1,  Student  *stu2);

BOOL  biJiaoScore(Student  *stu1,  Student  *stu2)

{

return  stu1 ->score  >  stuff ->score;

}

/ / 定义一个按年龄排序的函数

BOOL  compareAge(Student  *stu1, Student  *stu2);

BOOL  compareAge(Student  *stu1, Student  *stu2)

{

return  stu1 ->age  >  stuff ->age

}

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

/ / 2:创建学生结构体数组

Student  *student = {

{"索隆",  22,  93},

{"香吉士",  21,  97},

{"犬夜叉",  20,  80},

{"路飞",  19,  70}

};

/ / 4:排序前调用打印函数打印结构体数组

int  count = sizeof(student) / sizeof(Student);

printfStudent(student, count);

/ / 7:调用函数

paiXuStudent(student,  count , biJiaoScore);

/ / paiXuStudent(student,  count , compareAge);按年龄排序(仅仅需传入函数就可)

/ / 8:打印排序后的结构体数组

printfStudent(student,  count);

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

C语言第11课的更多相关文章

  1. 第11课 - enum, sizeof, typedef 分析

    第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...

  2. OPENGL NEHE Lesson11 11课的计算公式推导

    计算多边形公式推导: 条件x 离散的值从0到45; y离散的值从0到45; z是符合正弦波. 问题: 1 要求x’=f(x)映射到 x’ ∈[-4.5, 4.5], x ∈{0, 1, 2, …, 4 ...

  3. Js笔记-第11课

    // 第11课         作用域精解     运行期上下文,当函数执行时,会创建一个成为执行期上下文的内部对象.一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独 ...

  4. 《快乐编程大本营》java语言训练班 2课:java的变量

    <快乐编程大本营>java语言训练班 2课:java的变量 1变量介绍 2变量分类,数值变量 3变量分类-字符串变量 4变量分类-布尔变量 5变量分类-对象 http://code6g.c ...

  5. [原创]零基础R语言教程---第二课---R语言入门

    这节教程简单描述了R语言中常用的数据类型, 向量,字符串,矩阵,列表,数据框,以及附带了一个小例子 对于这节课所附带的例子需要做下列补充: 1.这个例子面向于对整列的数据进行预测 2.如果你需要求单行 ...

  6. 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示

    1.数字字母 Unicode 编码 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content- ...

  7. C语言求1-1/3+1/5-1/7+...——小程序,大道理

    问题:用C语言编写程序求1-1/3+1/5-1/7+... 示例: #include <stdio.h> void main(){ ; ,a=; ){ sum=sum+n/a; n=-n; ...

  8. C语言I博课作业04

    这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2020-1/homework/11489 我在这个作业课程 ...

  9. C语言基础(11)-随机数发生器

    一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...

随机推荐

  1. Android截图

    Android截图很好的实现,从文档的发展,查看View有一个接口getDrawingCache(),这个接口可以得到View当调用这个接口的位图图像Bitmap. 抓取截图View在图像的某一个时刻 ...

  2. struts开发步骤

    说来惭愧.这是一个简单的struts折腾了很长一段时间,几乎相同的时间量就花了三天时间来解决.下面的步骤总结一下我开发:(我使用的是MyEclipse); 1.新建一个Exercise3的web Pr ...

  3. 【Android进阶】Android程序与JavaScript之间的简单调用

    本篇将讲解一个简单的Android与JavaScript之间的简单调用的小程序 效果图 工程结构 HTMLActivity.java代码 package com.example.javatojs; i ...

  4. 11gRAC CHM 管理

    Cluster Health Monitor(缩写CHM)是Oracle提供的工具,自己主动的资源来收集操作系统(CPU.内存.SWAP.过程.I/O与网络)用法. CHM数据被收集每秒一次,11.2 ...

  5. 跨容器Hybrid离线组件方案

    关键词:跨容器.Hybrid.离线 摘要:今天主要讨论的是离线组件跨容器方案,想了解在线页面如何跨webview容器,可以看 http://www.cnblogs.com/yexiaochai/p/5 ...

  6. WP8关于对地图开发的改进

    原文:WP8关于对地图开发的改进 微软在2012年6月21日 发布了 Windows Phone 8的更新.带来大量的功能更新和全新的SDK.作为重头戏的部分是引入了 C++ 和 DirectX,支持 ...

  7. H.265/HEVC Codec 编解码 (MP4 和 TS)

    1. H.265/HEVC 播放器 1) VLC media player 2.1.3 (眼下不支持H.265 TS播放) 2)ffmpeg中的ffplay (如:ffplay  hevc.ts) 3 ...

  8. 【C++基金会 04】vector详细解释

    根据写博客开始总有一些事情的习惯,加鸡汤文,今天请原谅我记得. ============================================= 今天要写的内容是顺序型容器.首先,标准库定义 ...

  9. Android Studio简单设置(转)

    Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings --> Appearance --> Th ...

  10. document.all使用

    document.all 一个. document.all它是在页面中的所有元素的集合.例如:      document.all(0)一个元素 二. document.all能够推断浏览器是否是IE ...