函数指针、指针函数

指针函数:返回类型是指针的函数!
  int * fun(int x);     //返回的类型是指针的函数。
函数指针:指向一个函数的指针!
  int (*fun)(int x);    //函数指针。返回值类型 (*指针变量名)(形参列表)
                              函数指针本身是指针变量。只不过指向函数。


函数指针:

例1:用typedef定义函数指针
typedef  返回类型(*新类型)(参数表)

typedef char (*PTRFUN)(int);
PTRFUN pFun;             //第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。
char glFun(int a){ 
  return;
}
void main(){
    pFun = glFun;
    (*pFun)(2);
}

typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int 为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
             

例子:函数指针的使用。

#include<stdio.h>

typedef int (* FP_CALC )(int, int);    //声明一个变量类型FP_CALC,FP_CALC是一个指向函数的指针。函数有两个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;
}

FP_CALC   calc_func (char op){          //op为'+',根据op的值返回函数的地址。返回值的类型为函数指针。
  switch (op){
    case '+': return  add ;            //函数名就是该函数所占内存的首地址。
    case '-': return sub;
    case '*': return mul;
    case '/': return div;
    default:
      return NULL;
  }
  return NULL;
}

int  calc (int a, int b, char op){        

  FP_CALC  fp = calc_func(op);    //fp是函数指针,类型是函数指针类型。op为'+',calc_func函数返回值是add  
  if (fp) return fp(a, b);                //如何通过函数指针,使用函数。
  else return -1;
}

void main(){
  int a = 100, b = 20;  
  printf("calc(%d, %d, %c) = %d\n", a, b, '+',  calc(a, b, '+') );   //调用calc函数。
  printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
  printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
  printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
}

运行结果  
 calc(100, 20, +) = 120
 calc(100, 20, -) = 80
 calc(100, 20, *) = 2000
 calc(100, 20, /) = 5


例子2:函数指针的使用。

#include <stdio.h>

void printWelcome(int len){
      printf("欢迎欢迎 -- %d/n", len);
}

void printGoodbye(int len){
      printf("送客送客 -- %d/n", len);
}

void callback(int times,  void (* print)(int)){      //定义函数指针类型print,指向这样一种函数:参数是int型,返回类型为void。
      int i;
      for (i = 0; i < times; ++i){
              print(i);                                             //通过函数指针print来使用函数。
      }
      printf("/n我不知道你是迎客还是送客!/n/n");
}


void main(void){
      callback(10, printWelcome);                       //调用callback函数,将 printWelcome传给函数指针。这样函数指针就可以使用函数了。
      callback(10, printGoodbye);
      printWelcome(5);
}









指针函数:

返回值是指针。这个也不常用。












函数指针指针函数是C语言中的两个概念。函数指针是指指向函数指针变量,它存储了函数的入口地址,可以通过该指针变量调用函数或将其作为参数传递给其他函数函数指针的声明形式为int (*fun)(int x, int y),其中的星号是属于函数名的。\[1\]\[2\] 指针函数则是指返回值为指针(即地址值)的函数。它的声明形式可以是int* fun(int x, int y)、int *fun(int x, int y)或int* fun(int x, int y)。指针函数和普通函数的区别在于返回值类型是指针。\[1\]\[3\] 总结来说,函数指针是指向函数指针变量,可以用于调用函数或作为函数参数;而指针函数是返回值为指针函数。它们在用法和声明形式上有所不同。 #### 引用[.reference_title] - *1* *3* [函数指针指针函数用法和区别](https://blog.csdn.net/luoyayun361/article/details/80428882)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [指针函数函数指针](https://blog.csdn.net/xc_123/article/details/115178826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值