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

函数名相当于首地址.
函数指针定义:返回值类型  (*函数指针变量名)(参数类型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. linux——压缩解压命令学习简单笔记

    一: 命令名称:gzip 命令英文原意:GNU zip 命令所在路径:/bin/gzip 执行权限:所有用户 语法:gzip 选项 [文件] 功能描述:压缩文件 压缩后文件格式:.gz 1:只能压缩文 ...

  2. go 通道

    1. package main import "fmt" func sum(s []int, c chan int) { sum := for _, v := range s { ...

  3. Mysql 统计查询

    SELECT ub.telphone, SUM(IF(b.type = 1 AND b.level = 1, 1, 0)) AS type11, SUM(IF(b.type = 1 AND b.lev ...

  4. android调用照相机拍照获取照片并做简单剪裁

    引用转载http://www.cnblogs.com/eyu8874521/archive/2012/07/20/2600697.html 效果: 客服端代码:   package com.cn.lx ...

  5. [VIM插件]fedora22编译vim7.4对perl组件支持的问题

    在fedora22下,重新编译安装vim7.4的时,在编译perl组件支持时,出现如下错误: /bin/perl -e 'unless ( $] >= 5.005 ) { for (qw(na ...

  6. Spring AMQP 源码分析 03 - MessageConverter

    ### 准备 ## 目标 了解 Spring AMQP 消息转化实现   ## 相关资源 Quick Tour for the impatient:<http://docs.spring.io/ ...

  7. CentOS Redhat Linux安装 Oracle Client 的注意点

    1) 安装文件要拷贝到本地文件系统执行 2) 虽然不知道 libXmu是什么,但是安装之后,关联包安装了许多,感觉很省心 yum install libXmu.i686 3)  还有找不到的包的话,用 ...

  8. 012 - jstat命令查看jvm的GC情况 | jvm

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量. 命令的格式如下: jstat -<option> [-t] [-h<lines>] <vmid> [ ...

  9. linux下修改mysql登录密码

    一.修改mysql密码 1.停止服务      /etc/init.d/mysqld stop   2.以不检查权限的方式启动     /etc/init.d/mysqld --skip-grant- ...

  10. 5-11敏捷开发rails的章节: Rspec(使用方法) ,Slim(使用操作简介)

    Rspec: test Slim :可以取代ERB的模版语言.(简单了解了以下,方便写代码,但我觉得不方便读.还是用原生的html) Webpack管理css: 不再使用app/assets/styl ...