函数指针三种定义与使用方式

简介: 函数指针三种定义与使用方式

函数类型剖析


通过什么来区分两个不同的函数?


一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。


函数三要素: 名称、参数、返回值。(C 语言中的函数有自己特定的类型)


c 语言中通过 typedef 为函数类型重命名:


// f 为函数类型
typedef int f(int, int); 
// p 为函数类型
typedef void p(int); 


这一点和数组一样,因此我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。


注意:通过函数类型定义的变量是不能够直接执行,因为没有函数体。只能通过类型定义一个函数指针指向某一个具体函数,才能调用。


typedef void(p)(int, int);
void my_func(int a, int b)
{
  printf("%d %d\n", a, b);
}
void test()
{
  p p1;
  //p1(10,20); //错误,不能直接调用,只描述了函数类型,但是并没有定义函数体,没有函数体无法调用
  p* p2 = my_func;
  p2(10, 20); //正确,指向有函数体的函数入口地址
}


函数指针(指向函数的指针)


  • 函数指针定义方式(先定义函数类型,根据类型定义指针变量);


  • 先定义函数指针类型,根据类型定义指针变量;


  • 直接定义函数指针变量;


例如下面my_func函数


int my_func(int a, int b) {
  printf("ret:%d\n", a + b);
  return 0;
}


//1. 先定义函数类型,通过类型定义指针
void test01() {
  typedef int(FUNC_TYPE)(int, int);
  FUNC_TYPE* f = my_func;
  //如何调用?
  (*f)(10, 20);
  f(10, 20);
}
//2. 定义函数指针类型
void test02() {
  typedef int(*FUNC_POINTER)(int, int);
  FUNC_POINTER f = my_func;
  //如何调用?
  (*f)(10, 20);
  f(10, 20);
}
//3. 直接定义函数指针变量
void test03() {
  int(*f)(int, int) = my_func;
  //如何调用?
  (*f)(10, 20);
  f(10, 20);
}


函数指针和指针函数的区别:


  • 函数指针是指向函数的指针;


  • 指针函数是返回类型为指针的函数;


代码案例


C语言提高:函数指针做函数参数:


https://yangyongli.blog.csdn.net/article/details/118710963

相关文章
|
23天前
|
C++
定义和使用指向函数的指针变量
定义和使用指向函数的指针变量
16 1
|
23天前
|
存储 C语言 C++
怎样定义指针变量
怎样定义指针变量
14 2
|
7月前
|
存储 编译器 程序员
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
|
8天前
|
存储 C语言
怎样定义指针变量
怎样定义指针变量
12 0
|
8天前
|
C语言
怎样定义和使用指向函数的指针变量
怎样定义和使用指向函数的指针变量
6 0
|
9天前
|
存储 编译器 C语言
C语言指针变量的定义与初始化技术详解
C语言指针变量的定义与初始化技术详解
21 0
|
16天前
空指针和野指针的区别和定义
空指针和野指针的区别和定义
|
23天前
|
存储 编译器 C语言
【C++】类与对象【定义、访问限定符、this指针】
【C++】类与对象【定义、访问限定符、this指针】
6 1
|
23天前
|
存储 安全 编译器
C语言怎样定义指针变量
C语言怎样定义指针变量
13 0
|
23天前
|
存储 编译器 程序员
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)