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

函数名相当于首地址.
函数指针定义:返回值类型  (*函数指针变量名)(参数类型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

    grid=[['.', '.', '.', '.', '.', '.'], [', '.', '.', '.'], [', '.', '.'], [', '.'], ['], [', '.'], [' ...

  2. iOS进阶_Socket(Socket简介&代码演练)

    网络通讯三要素 TCP & UDP 三次握手 断开连接的四次握手 Socket套接字 了解了上面的概念,我们开始演练一下Socket #import "ViewController. ...

  3. android--------Android内存分析工具的使用

    内存分析(in-memory analytics)是我们编写速度快.效率高的代码必不可少的知识.如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的.那么内存分析是什么? ...

  4. php安装redis扩展全

    一.安装redis mac 下安装也可以使用 homebrew,homebrew 是 mac 的包管理器. 1.执行 brew install redis 2.启动 redis,可以使用后台服务启动  ...

  5. svn拒绝连接

    svn 服务开启: svnserve -d -r /home/svn

  6. android webservice 成功版(帅哥)

    package com.ts.xtweatherreport01;import java.io.UnsupportedEncodingException; import android.annotat ...

  7. OAF中多语言的实现(转)

    正好前两天研究过这个问题,分享一下啊. 标题:        OAF中多语言的实现概述:        OAF的多语言的实现有两种方式,其一是直接通过页面上面的“个性化”连接,连接到指定的页面后,进行 ...

  8. spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid

    SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...

  9. Edraw安装图解

    Edraw安装图解   Success

  10. PHP:php中的双引号和单引号的区别

    双引号: $a="369"; $b="$a"; echo $b;//输出:369 单引号: $a="369"; $b='$a'; echo ...