c语言(函数指针,回调函数)

//  main.m

//  1-28随堂笔记

//讲师: 小辉

//笔者: 王学文

//  Created by lanouhn on 15/1/28.

//  Copyright (c) 2015年 lanouhn. All rights reserved.

// 函数指针, 回调函数

#import <Foundation/Foundation.h>

struct student {

char name[20];

float score;

int age;

};

typedef struct student Student;

void printHello();

void printHello() {

printf("HelloWorld!\n");

}

int maxNumber(int a, int b);

int maxNumber(int a, int b) {

return a > b ? a : b;

}

int sumNumber(int m, int n);

int sumNumber(int m, int n) {

return m + n;

}

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

int function(int a, int b, int (*p)(int, int)) {

return p(a, b);

}

BOOL isScore(Student *p1, Student *p2); //判断分数高低,

BOOL isScore(Student *p1, Student *p2) {

//1.

//    if (p1 ->score < p2 ->score) {

//        return YES;

//    } else {

//        return NO;

//    }

//2.

//    return p1 ->score < p2 ->score  ? YES : NO;

//3.

return p1 -> score  < p2 ->score;

}

BOOL isName(Student *p1, Student *p2); //判断姓名的前后

BOOL isName(Student *p1, Student *p2) {

return strcmp(p1 ->name, p2 ->name) > 0;

}

BOOL isAge(Student *p1, Student *p2); //判断年龄的大小

BOOL isAge(Student *p1, Student *p2) {

return p1 ->age > p2 ->age;

}

typedef BOOL (*SortType)(Student *, Student *); //类型转换

SortType isType(char *string); //判断main函数中调用函数时按什么排序

SortType isType(char *string) {

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

return isName;

} else if (strcmp(string, "age") == 0) {

return isAge;

} else if (strcmp(string, "score") == 0) {

return isScore;

} else {

return isName;

}

}

void sort(Student *p, int n, char *string); //冒泡交换结构体

void sort(Student *p, int n, char *string) {

SortType funp = isType(string); //(重定义)指针指向按什么类型排序

BOOL flag = YES;

for (int i = 0; i < n - 1 && flag; i++) {

flag = NO;

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

if (funp(p + j, p + j + 1)) { //funp用的是前面BOOL函数里的返回值

Student temp = {0};

temp = *(p + j);

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

*(p + j + 1) = temp;

flag = YES;

}

}

}

}

//void sort(Student *p, int n, SortType funp);

//void sort(Student *p, int n, SortType funp) {

//    BOOL flag = YES;

//    for (int i = 0; i < n - 1 && flag; i++) {

//        flag = NO;

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

//            if (funp(p + j, p + j + 1)) {

//                Student temp = *(p + j);

//                *(p + j) = *(p + j + 1);

//                *(p + j + 1) = temp;

//                flag = YES;

//            }

//        }

//    }

//}

void printStu(Student *p, int n);

void printStu(Student *p, int n) {

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

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

}

}

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

//栈区地址

int a = 0;

printf("%p\n", &a);

//堆区地址

int *p = malloc(sizeof(int) * 10);

printf("%p\n", p);

//静态全局区

static int b = 1;

printf("%p\n", &b);

//常量区地址

char *p1 = "ABC";

printf("%p\n", p1);

//代码区地址

printHello();

//数组的名字,是数组的首地址

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

printf("%p\n", array);

//函数的名字,也是函数的首地址

//函数的首地址在代码区

printf("%p\n", printHello);

//获取两个数的最大值()函数

maxNumber(5, 10);

printf("%p\n", maxNumber);

//存储数组的首地址

//int *p2 = array;

//如何存一个函数的首地址

//函数指针定义

//返回值类型(*p)(参数类型1, 参数类型2, ...) = 初值;

//注:

//1. p是指针名字

//2. 除指针名字p以外的, 是函数指针的类型

int (*p3)(int, int ) = NULL;

p3 = maxNumber;

//指向数组首地址的指针有什么作用

//可以当做数组使用

//p2[1]; *(p2 + 1);

//指向函数首地址的指针; 可以用来调用函数

maxNumber(1, 2);

p3(1, 2);

//定义一个指针指向printHello

void (*p4)() = NULL;

p4 = printHello;

p4();

//求两个整型数之和的函数

int (*p5)(int, int) = NULL;

p5 = sumNumber;

int sum = p5(10, 20);

printf("%d\n", sum);

//函数指针作为函数的参数使用

int sum1 = function(1, 2, sumNumber);

int max1 = function(1, 2, maxNumber);

printf("两数之和%d, 两数中最大值%d\n", sum1, max1);

//回调函数: 使用函数指针来调用函数

//重命名函数指针类型

//函数指针的重命名比较特殊,新名字需要写在*后面

typedef int (*ABC)(int, int);

//ABC p6 = NULL;

//写一函数查找成绩90分以上的成员,使用回调函数

//定义一个结构体数组

Student arr[5] = {

{"zhangsan", 80.0, 25},

{"lisi", 90.5, 22},

{"wangwu", 70.0, 20},

{"zhaoliu", 59.9, 18},

{"zhouqi", 88.0, 24}

};

//根据考试成绩由高到低排序

printStu(arr, 5);

//    //姓名

//    sort(stu, 5, isName);

//    //成绩

//    sort(stu, 5, isScore);

//    //年龄

//    sort(stu, 5, isAge);

printf("\n");

sort(arr, 5, "name");

printStu(arr, 5);

printf("\n");

sort(arr, 5, "score");

printStu(arr, 5);

printf("\n");

sort(arr, 5, "age");

printStu(arr, 5);

return 0;

}

时间: 2024-10-13 17:17:32

c语言(函数指针,回调函数)的相关文章

新手,对函数,函数指针,回调函数, 函数指针作为函数的返回值和block的一些见解

很多初学者,学c语言时,看到函数都觉得难,我也是,一开始觉得函数太难了,后来慢慢就理解了 第一:函数 在c语言中最简单的函数一般有四种: 1, 无返回值, 无参数. 2, 无返回值,有参数. 3, 有返回值,无参数. 4, 有返回值,有参数 1, 无返无参  定义方式:      void 函数名(); 一般不怎么用这种形式的函数,可用来输出,打印 void functionOne() { printf("无返回值,无参数"); // 没有返回值不能写return } int main

10 函数指针 回调函数

?.函数指针定义 ?.函数回调 三.动态排序 四.函数返回值是函数指针

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

函数指针和指针函数和回调函数以及函数指针数组

1.首先来说,函数指针 就是函数的指针 2.指针函数,就是指针的函数.也就是返回值是个指针 一.指针 [1]指针  1--- 指针变量:用于存放地址量的变量  2--- 地址常量   int a = 20:   int *p = &a: [2]运算符  1--- &  2--- *(指针解引用):通过地址获取其内容  3--- []:只针对于指针运算.指针加单位长度,后取*运算. 二.函数 [1]指针函数 [2]函数指针 [3]函数指针数组  本质:数组,由多个元素组成  元素:函数指针类

C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态

1,数组指针语法梳理 回顾,如何定义数组数据类型: 回顾,如何定义指针类型数组: 回顾,如何直接定义 一个指向数组类型的指针: 2,函数指针语法梳理 1)如何定义一个函数类型 2)如何定义一个函数指针类型 3)如何定义一个函数指针(指向一个函数的入口地址) [中级程序员 转 高级程序员的 必经之路] 1,函数类型做函数的参数 把函数的入口地址传过来,奇怪的效果:[多态就是这样] 函数指针 做 函数参数 思想剖析 1,数组指针语法梳理 回顾,如何定义数组数据类型: [email protected

c语言的函数指针和函数指针数组的简单demo

今天,简单记录一下,函数指针和函数指针数组的使用,废话不多说,直接贴上代码,里面有详细的注释,方便以后查阅. 1 #include <cstdio> 2 #include <Windows.h> 3 4 typedef void(*myFun)(const char*);//这里定义的一个函数类型(返回值为void,参数为const char*),类型名为myFun,使用见第28行 5 6 void(*func)(const char* name); //声明了一个函数指针,指针名

Java/Android中的函数调用&amp;回调函数&amp;自定义回调函数

在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都是那一篇"C中的回调函数.....指针.....java....",一点看不出来是自己的思路,估计都是哪哪哪抄来的!(呵呵,要么就是吐槽对了,要么就是我水平太烂读不懂还妄加评论)还有一些很不错的文章,我会在最后参考中加上链接,大家可以看看. 那么来开始我们的正题--什么是回调函数? 我们一

Day8 函数指针做函数参数

课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. 多继承的二义性 . 重载 重写 重定义. 实现多态的理论基础:函数指针做函数参数. vptr指针与虚函数表. 构造函数不应为虚函数 多态会降低程序的执行速度.不建议所有的函数都是虚函数. 多态时的指针步进. 多继承在项目开发中使用的比较少. linux从2.4内核升级到2.6的时候,做到了电源可以热插拔,提前将电源驱动的接口规划

ctypes给扩展模块中的函数传递回调函数

C语言中的回调函数 什么是回调函数我就不介绍了,我们先来看看C语言中如何使用回调函数. 函数指针 不过在看回调函数之前,我们先看看如何把一个函数赋值给一个变量.准确的说,是让一个指针指向一个函数,这个指针叫做函数指针.通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数.函数指针可以像一般函数一样,用于调用函数.传递参数. #include <stdio.h> int add(int a, int b){ int c; c = a + b; return c; } in