函数指针:指向函数的指针变量.

函数名相当于首地址.
函数指针定义:返回值类型  (*函数指针变量名)(参数类型1,参数类型2,....)=初始值
函数指针类型:返回值类型  (*)(参数类型1,参数类型2,....)=初始值
如:int  (*)(int int)  表示返回值是int类型,参数有两个,都为int类型的指针变量类型
void sayHello(){
printf("你好!!! \n");
}
void (*p)()=NULL;   //表示返回值为空,无参数的,函数指针变量名是p的函数指针
p=sayHello;    //因为函数名就是地址,就是把函数名赋值给函数指针变量p
函数指针在指向相应地址后可以只用()调用函数

给函数指针类型起别名
typedef  返回值(*新类型名)(参数类型1,参数类型2...)
如:typedef int(*FUN)(int,int)  表示给int (*)(int,int) 起了个别名FUN

函数回调:用函数指针来调用函数
如:

#import <Foundation/Foundation.h>

//定义一个结构体,使用函数回调实现动态排序(年龄.姓名.分数)

typedef struct student{

char name[50];

int age;

float score;

}Student;

BOOL compareName(Student stu1,Student stu2);  //声明

BOOL compareName(Student stu1,Student stu2){  //按姓名排序实现

return strcmp(stu1.name,
stu2.name);

}

BOOL compareAge(Student stu1,Student stu2);
  //声明

BOOL compareAge(Student stu1,Student stu2){
  //按年龄排序实现

return stu1.age>stu2.age?YES:NO;

}

BOOL compareScore(Student stu1,Student stu2);
  //声明

BOOL compareScore(Student stu1,Student stu2){
  //按分数排序实现

return stu1.score>stu2.score?YES:NO;

}

void bubbleArray(Student *a,int count,BOOL (*p)(Student,Student));

void bubbleArray(Student *a,int count,BOOL (*p)(Student,Student)){ 
  //运行时函数,参数:一个指针变量,一个长度,一个函数指针

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

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

if (p(a[ j ],a[j+1]))
{    //由参数函数指针所指向的函数决定按什么类型排序

Student temp=a [ j ];

a[ j ]=a[j+1];

a[j+1]=temp;

}

}

}

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

printf("%s
%d %.2f \n",a[ i ].name,a[ i ].age,a[
i ].score);

}

}

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

Student stuArray[ 5 ]={
  //定义一个结构体数组

{"xijinping",98,80.0},

{"aobama",75,60.1},

{"benladeng",55,56.3},

{"pujing",58,88.6},

{"chengguan",63,98.0}

};

BOOL (*p)(Student,Student)=NULL; 
  //函数指针初始化

p=compareAge;     //为函数指针赋值,指向的是函数compareAge的地址

//    p=compareName;

//    p=compareScore;

bubbleArray(stuArray, 5,
p);   //调用函数

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言基础:函数指针 分类: iOS学习 c语言基础 2015-06-10 21:55 15人阅读 评论(0) 收藏的更多相关文章

  1. Python调用C可执行程序(subprocess) 分类: python 服务器搭建 C/C++ shell 2015-04-13 21:03 87人阅读 评论(0) 收藏

    从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn.os.popen.popen2.commands. ...

  2. 自定义view组件 分类: H1_ANDROID 2013-10-26 21:55 741人阅读 评论(0) 收藏

    参考<疯狂android讲义>第2版 2.1节P48,对应CustomViewDemo.zip. 若在开发过程中,发现现有的view均不能满足需要,可以自定义一个view. 自定义一个vi ...

  3. C语言基础:函数(Function) 分类: iOS学习 c语言基础 2015-06-10 21:48 14人阅读 评论(0) 收藏

    函数:一段具有某些特定功能的代码段. 使用函数的严格规定: 1.函数声明 2.函数定义 3.函数调用 函数声明:告知系统编译器该系统的函数名,函数参数,参数类型,参数个数,参数顺序等等,以便函数调用时 ...

  4. C语言基础:指针初级(补充) 分类: iOS学习 c语言基础 2015-06-10 21:54 19人阅读 评论(0) 收藏

    结构体指针:指向结构体指针的变量的指针. 结构体指针指向结构体第一个成员变量的首地址 ->:   指向操作符 定义的指针变量必须指向结构体的首地址,才可以使用  ->  访问结构体成员变量 ...

  5. C语言基础:初级指针 分类: iOS学习 c语言基础 2015-06-10 21:50 30人阅读 评论(0) 收藏

    指针:就是地址. &   取地址运算符 %p   打印地址占位符 int a=0; printf("%p ",&a);    指针变量:用来存放地址的变量 定义: ...

  6. C语言基础:内存 分类: iOS学习 c语言基础 2015-06-10 21:59 23人阅读 评论(0) 收藏

    全局变量:定义在函数之外.(不安全)   局部变量;定义在函数之内. 内存的划分:1栈区   2堆区  3静态区(全局区) 4常量区 5代码区 栈区..静态区.常量区.代码区的数据都是由系统分配和释放 ...

  7. C语言基础:数组 分类: iOS学习 c语言基础 2015-06-10 21:40 7人阅读 评论(0) 收藏

    数组:是由一组具有相同数据类型的数据组合而来. 数组定义:元素类型修饰符 数组名[数组个数]={元素1,元素2....};  int arr[ 2 ]={1,2};    //正确 int arr[ ...

  8. c语言基础:数据类型 分类: iOS学习 c语言基础 2015-06-10 21:43 9人阅读 评论(0) 收藏

    C语言基本数据类型大体上分为: 整型 和 浮点型   字节: 计算机中最小的储存单位     1 Byte = 8 bit 整型:         int     4                  ...

  9. C语言基础:进制转换,变量,常量,表达式,基本数据类型,输出函数,输入函数,运算符. 分类: iOS学习 c语言基础 2015-06-10 21:39 25人阅读 评论(0) 收藏

    二进制:以0b开头,只有0和1两种数字.如0101 十进制:0~9十个数字表示.如25 十六进制:以0~9,A~F表示,以0X开头.如0X2B 十进制转换为X进制:连除倒取余 X进制转换为十进制:按权 ...

随机推荐

  1. python 可视化时间转时间元组(自定义)

    >>> print(time.strptime('2018-9-30 11:32:23', '%Y-%m-%d %H:%M:%S')) time.struct_time(tm_yea ...

  2. 模版层Template layer

    每一个Web框架都需要一种很便利的方法用于动态生成HTML页面. 最常见的做法是使用模板. 模板包含所需HTML页面的静态部分,以及一些特殊的模版语法,用于将动态内容插入静态部分. 说白了,模板层就是 ...

  3. C语言位域解析&符号位扩展规则

    从一个例子说起: int main(void){ union{ int i; struct{ ; ; ; }bits; }num; printf("Input an integer for ...

  4. 编写自己的代码库(javascript常用实例的实现与封装)[转]

    1.前言 因为公司最近项目比较忙,没那么多空余的事件写文章了,所以这篇文章晚了几天发布.但是这也没什么关系,不过该来的,总是会来的.好了,其他的不多说的,大家在开发的时候应该知道,有很多常见的实例操作 ...

  5. Tomcat 中文乱码 设置UTF-8编码 问题解决办法

    在Java Web开发中,http请求带有中文字符的URI如果不处理容易出现乱码问题:这是因为Tomcat容器默认编码是iso-8859-1引起的,因此要避免出现乱码就要需要做相应的处理.解决办法如下 ...

  6. python-day63--前端

    一. 响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现不同的布局等 - 响应式怎么实现的? 1. CSS3 media query 媒体查询 2. JS去控制网页的布局和样式等 - 缺 ...

  7. spring PROPAGATION

    PROPAGATION_REQUIRED Support a current transaction; create a new one if none exists.  支持一个当前事务;如果不存在 ...

  8. C++ string类与scanf和printf

    string要用cin和cout输入和输出. 如果一定要用scanf和printf的话,格式为: s.resize(20);scanf("%s", &s[0]); prin ...

  9. $digest already in progress 解决办法

    Solution In short, instead of doing this: ... your controller code... $http.get('some/url', function ...

  10. win10解除密码