// 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;
}