C语言 — 指针进阶篇(下)

简介: 指针基础篇回顾可以详见: 指针基础篇(1)指针基础篇(2)指针进阶篇分为上下两篇,上篇介绍1 — 4,下篇介绍5 — 6字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数

前言

指针基础篇回顾可以详见:指针基础篇(1)指针基础篇(2)

  1. 指针进阶篇分为上下两篇,上篇介绍1 — 4,下篇介绍5 — 6
  2. 字符指针
  3. 数组指针
  4. 指针数组
  5. 数组传参和指针传参
  6. 函数指针
  7. 函数指针数组
  8. 指向函数指针数组的指针
  9. 回调函数

文章目录

前言

一、函数指针

1. 函数指针是什么

2. 函数指针声明

二、函数指针数组

1. 函数指针数组是什么

2. 举例说明

三、指向函数指针数组的指针

1. 指向函数指针数组的指针是什么

2.举例说明

四、回调函数

1. 回调函数是什么

2.举例说明

五、总结


一、函数指针


1. 函数指针是什么

函数指针指向函数的指针

函数指针是一个指向函数的指针变量。它可以保存某个函数的地址,并通过该指针变量调用相应的函数。使用函数指针可以方便地实现回调函数、代码复用等功能。

代码演示

#include <stdio.h>voidtest()
{
printf("hehe\n");
}
intmain()
{
printf("%p\n", test);
printf("%p\n", &test);
return0;
}

输出结果

image.png

结论

输出的都是 test 函数的地址,&test(取地址函数名)和 test(函数名)都是函数的地址


2. 函数指针声明

函数指针声明的一般格式如下:

返回类型 (*指针变量名)(参数列表);

其中,指针变量名是指向函数的指针变量的名称,返回类型参数列表分别是指向函数的指针变量所指向函数的返回值类型和参数类型列表。

演示代码

#include <stdio.h>
int add(int x,int y)
{
  return x + y;
}
int main()
{
  //int (*pr)(int, int) = add;
  int (*pr)(int, int) = &add;
  //int ret = (*pr)(4, 5);  //使用函数指针调用
  int ret = pr(4,5);//也可以这样写
  printf("%d", ret);
  return 0;
}

以下是函数指针变量

int (*pr)(int, int) = add;
int (*pr)(int, int) = &add;

函数指针调用函数,通过指针间接访问函数

int ret = (*pr)(4, 5);  加*号时一定要带括号
int ret = pr(4,5);

二、函数指针数组


1. 函数指针数组是什么

函数指针数组是由一组函数指针组成的数组。可以通过函数指针数组来存储多个不同的函数,并根据需要来选择调用适当的函数。


2. 举例说明

例如,让我们创建一个函数指针数组来存储三个函数,每个函数都有一个参数,返回一个整数:

int add(int x) 
{
  return x + 1;
}
int subtract(int x) 
{
  return x - 1;
}
int multiply(int x) 
{
  return x * 2;
}
int main()
{
  int (*function_array[3])(int) = { add, subtract, multiply };
  return 0;
}

这将创建一个名为 function_array 的数组,其包含三个函数指针。使用该数组可以调用相应的函数:

int result = 0;
result = function_array[0](3);  // 调用 add 函数,返回 4
result = function_array[1](3);      // 调用 subtract 函数,返回 2
result = function_array[2](3);      // 调用 multiply 函数,返回 6

函数指针数组是在需要动态选择和调用函数的情况下非常有用的。

三、指向函数指针数组的指针


1. 指向函数指针数组的指针是什么

指向函数指针数组的指针是一个指针,它指向一个函数指针数组的首元素。这个指针可以用来访问数组中的每个函数指针。例如:


2.举例说明

void (*func_ptr_array[2])(int); // 声明一个包含两个函数指针的数组
void func1(int x) {
    printf("func1: %d\n", x);
}
void func2(int x) {
    printf("func2: %d\n", x);
}
int main() {
    func_ptr_array[0] = func1;
    func_ptr_array[1] = func2;
    void (**ptr_to_func_ptr_array)(int) = func_ptr_array; // 声明一个指向函数指针数组的指针,初始化为函数指针数组的首元素
    (*ptr_to_func_ptr_array[0])(10); // 调用第一个函数指针,输出 "func1: 10"
    (*ptr_to_func_ptr_array[1])(20); // 调用第二个函数指针,输出 "func2: 20"
    return 0;
}

在上面的例子中,我们声明了一个包含两个函数指针的数组func_ptr_array并将它们分别初始化为func1 func2然后,我们声明了一个指向函数指针数组的指针 ptr_to_func_ptr_array,并将它初始化为 func_ptr_array 的首元素。最后,我们使用指针 ptr_to_func_ptr_array 访问数组中的每个函数指针,并通过它们调用对应的函数。指向函数指针数组的指针是一个指针,它指向一个函数指针数组的首元素。这个指针可以用来访问数组中的每个函数指针。例如:

void (*func_ptr_array[2])(int); // 声明一个包含两个函数指针的数组
void func1(int x) {
    printf("func1: %d\n", x);
}
void func2(int x) {
    printf("func2: %d\n", x);
}
int main() {
    func_ptr_array[0] = func1;
    func_ptr_array[1] = func2;
    void (**ptr_to_func_ptr_array)(int) = func_ptr_array; // 声明一个指向函数指针数组的指针,初始化为函数指针数组的首元素
    (*ptr_to_func_ptr_array[0])(10); // 调用第一个函数指针,输出 "func1: 10"
    (*ptr_to_func_ptr_array[1])(20); // 调用第二个函数指针,输出 "func2: 20"
    return 0;
}

在上面的例子中,我们声明了一个包含两个函数指针的数组 func_ptr_array,并将它们分别初始化为 func1func2。然后,我们声明了一个指向函数指针数组的指针 ptr_to_func_ptr_array,并将它初始化为 func_ptr_array 的首元素。最后,我们使用指针 ptr_to_func_ptr_array 访问数组中的每个函数指针,并通过它们调用对应的函数。指向函数指针数组的指针是一个指针,它指向一个函数指针数组的首元素。这个指针可以用来访问数组中的每个函数指针。例如:

void (*func_ptr_array[2])(int); // 声明一个包含两个函数指针的数组
void func1(int x) {
    printf("func1: %d\n", x);
}
void func2(int x) {
    printf("func2: %d\n", x);
}
int main() {
    func_ptr_array[0] = func1;
    func_ptr_array[1] = func2;
    void (**ptr_to_func_ptr_array)(int) = func_ptr_array; // 声明一个指向函数指针数组的指针,初始化为函数指针数组的首元素
    (*ptr_to_func_ptr_array[0])(10); // 调用第一个函数指针,输出 "func1: 10"
    (*ptr_to_func_ptr_array[1])(20); // 调用第二个函数指针,输出 "func2: 20"
    return 0;
}

在上面的例子中,我们声明了一个包含两个函数指针的数组 func_ptr_array,并将它们分别初始化为 func1func2。然后,我们声明了一个指向函数指针数组的指针 ptr_to_func_ptr_array,并将它初始化为 func_ptr_array 的首元素。最后,我们使用指针 ptr_to_func_ptr_array 访问数组中的每个函数指针,并通过它们调用对应的函数。


四、回调函数


1. 回调函数是什么

回调函数是一种函数,它作为参数传递给另一个函数。当调用该函数时,它将执行传递的回调函数。这种技术通常用于异步编程中,因为它允许程序在等待某些操作完成时执行其他任务。回调函数通常用于处理结果和错误,以便相应地处理它们。


2.举例说明

下面是一个简单的C语言回调函数的示例:

#include <stdio.h>
void callback(int x) {
    printf("The square of %d is %d\n", x, x*x);
}
void operate(int x, void (*cb)(int)) {
    cb(x);
}
int main() {
    operate(5, callback); //将callback作为operate函数的参数传递
    return 0;
}

在这个示例中,callback函数被定义为一个回调函数,它接受一个整数参数x并输出其平方。operate函数也被定义,它接受一个整数参数x和一个回调函数指针cb作为参数。在main函数中,我们将callback函数作为参数传递给operate函数,并将整数5作为第一个参数传递。当operate函数完成其操作(这里是输出平方值)时,它将调用传递的回调函数cb,并将操作结果作为参数传递给它,从而实现异步事件处理和代码逻辑分离。下面是一个简单的C语言回调函数的示例:


五、总结

本期博客介绍了函数指针、函数指针数组、指向函数指针数组的指针、回调函数

  1. 函数指针:函数指针是一个指向函数的指针变量。
  2. 函数指针数组:是由一组函数指针组成的数组。
  3. 指向函数指针数组的指针:是一个指针,它指向一个函数指针数组的首元素。
  4. 回调函数:是一种函数,它作为参数传递给另一个函数。

如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。

目录
相关文章
|
8天前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
17天前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
1月前
|
存储 编译器 C语言
【C语言篇】深入理解指针2
代码 const char* pstr = "hello world."; 特别容易让初学者以为是把字符串 hello world.放 到字符指针 pstr ⾥了,但是本质是把字符串 hello world. 首字符的地址放到了pstr中。
|
1月前
|
存储 程序员 编译器
【C语言篇】深入理解指针1
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。
|
1月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
1月前
|
C语言
【C语言】指针速览
【C语言】指针速览
16 0
|
1月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
1月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
4月前
|
C语言
C语言---指针进阶
C语言---指针进阶
40 0