函数指针的typedef

1.定义函数的指针类型:

就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。

一个自定义数据类型的例子。

typedef int* PINT; //为int* 类型定义了一个PINT的别名
int main()
{
  int x;
  PINT px=&x; //与int * px=&x;是等价的。PINT类型其实就是int * 类型
  *px=10; //px就是int*类型的变量
  return 0;
}

看一下函数指针类型的定义及使用:

void MyFun(int x); //此处的申明也可写成:void MyFun( int );
typedef void (*FunType)(int ); //这样只是定义一个函数指针类型
FunType FunP; //然后用FunType类型来申明全局FunP变量

int main(int argc, char* argv[])
{
   //FunType FunP; //函数指针变量当然也是可以是局部的 ,那就请在这里申明了。
   MyFun(10);
   FunP=&MyFun;
   (*FunP)(20); 

   return 0;
}

void MyFun(int x)
{
   printf(“%d\n”,x);
}

首先,在void (*FunType)(int ); 前加了一个typedef 。这样只是定义一个名为FunType函数指针类型,而不是一个FunType变量。
然后,FunType FunP;  这句就如PINT px;一样地申明一个FunP变量。
其它相同。整个程序完成了相同的事。
这样做法的好处是:
有了FunType类型后,我们就可以同样地、很方便地用FunType类型来申明多个同类型的函数指针变量了。如下:
FunType FunP2;
FunType FunP3;
//……

2.函数指针作为某个函数的参数

既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。

实例:我要设计一个CallMyFun函数,这个函数可以通过参数中的函数指针值不同来分别调用MyFun1、MyFun2、MyFun3这三个函数(注:这三个函数的定义格式应相同)。

void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int ); //②. 定义一个函数指针类型FunType,与①函数类型一至
void CallMyFun(FunType fp,int x);

int main(int argc, char* argv[])
{
   CallMyFun(MyFun1,10); //⑤. 通过CallMyFun函数分别调用三个不同的函数
   CallMyFun(MyFun2,20);
   CallMyFun(MyFun3,30);
}
void CallMyFun(FunType fp,int x) //③. 参数fp的类型是FunType。
{
  fp(x);//④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的
}
void MyFun1(int x) // ①. 这是个有一个参数的函数,以下两个函数也相同
{
   printf(“函数MyFun1中输出:%d\n”,x);
}
void MyFun2(int x)
{
   printf(“函数MyFun2中输出:%d\n”,x);
}
void MyFun3(int x)
{
   printf(“函数MyFun3中输出:%d\n”,x);
}
时间: 2024-10-06 08:31:34

函数指针的typedef的相关文章

c语言定义函数指针和typedef简写

二种方法来定义函数指针 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 int add(int a, int b) 6 { 7 return a + b; 8 } 9 10 //void msg(char s[]) 11 //void (*p)(char s[]) 函数指针的定义方法 12 //void (*)(char *s) 函数指针的类型 13 14 void msg(char

结构体中函数指针与typedef关键用途(函数指针)

// 结构体函数指针.  #include<stdio.h> //为了代码的移植考虑,一般使用typedef定义函数指针类 ,另一个好处是,减少代码的书写量.  typedef void (*shout)(char *name,int age); typedef struct {  //用指针来存储字符串     char *name;    int age ;    shout personinfo; }person; //类似于c++中类方法的实现,在这里,是为结构体中指针函数提供实现.在

函数指针与typedef

#include<bits/stdc++.h> using namespace std; //定义一个函数指针 typedef int (*Fun)(int,int); int add(int a,int b){return a+b;} int sub(int a,int b){return a-b;} int mul(int a,int b){return a*b;} int _div(int a,int b){return b?a/b:-1;} Fun fun(char op) { swi

C语言 函数指针定义三种方式

//函数指针 #include<stdio.h> #include<stdlib.h> #include<string.h> //函数指针类型跟数组类型非常相似 //函数名就是函数的地址,函数的指针,对函数名进行&取地址操作,还是函数名本身,这是C语言编译器的特殊处理 void test(int a){ printf("a=%d\n",a); } void ProtectA(){ //定义函数类型 typedef void(FunType)(

C++ 函数指针

参考链接: http://hipercomer.blog.51cto.com/4415661/792300 C++ 静态函数指针的使用方法 demo 一  调用方法 void LoadingLayer::init() { //定义两个不同类型的函数指针类型 typedef ServerZoneLayer* (*subclass)(); typedef CCLayer* (*superclass)(); //创建一个函数指针 subclass subfun = &ServerZoneLayer::

Scheme中lambda表达式与函数指针小例

SICP/Chapter2/Exercise-2.4 Lambda表达式语法 (lambda kw-formals body) 题目描述 用过程性表示方式重写序对的cons.car.cdr Scheme代码 (define (cons-24 x y) (lambda (m) (m x y))) (define (car-24 z) (z (lambda (p q) p))) 这段代码只有4行,但是逻辑关系并不好理解. 原因在于函数式语言的自顶向下实现方式不符合一般的逻辑习惯. lambda以类似

C 语言实现多态的原理:函数指针

C语言实现多态的原理:函数指针 何为函数指针?答案:C Programming Language. 可以查阅下,从原理上来讲,就是一个内存地址,跳过去执行对应的代码段. 既然如此,在运行时决定跳到哪个地方去执行特定的代码即可. 一个简单的版本: 以音频解码器作为例子:AAC 解码器,Mpeg解码器,以及其他类型的解码器. 那手动的多态可能会这样实现: U32 audioHandle = AudioDecOpen(int type) { if(type == aac) return aac_ope

C基础--函数指针的使用

之前在看代码的时候,看了函数指针的使用,大体分为如下几类: 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰: 函数指针作为另一个函数的参数,用作回调: linux中经常使用来达到相同接口,实现不同,如: 1 struct platform_driver { 2 int (*probe)(struct platform_device *); 3 int (*remove)(struct platform_device *); 4 void (*shutdo

你必须知道的指针基础-7.void指针与函数指针

一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针”. 因此void*只能表示一个地址,不能用来&取值,也不能++--移动指针,因此不知道多少字节是一个数据单位. int nums[] = {3,5,6,7,9}; void* ptr1 = nums; //int i = *ptr1; // 对于void指针没法直接取值 int* ptr2 = (i