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

//  main.m

//  1-28随堂笔记

//讲师: 小辉

//笔者: 王学文

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

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

// 函数指针, 回调函数

#import

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;

}

原文:http://www.cnblogs.com/xiaoxuetongxie/p/4256338.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值