逍遥自在学C语言 | 指针函数与函数指针

前言

在C语言中,指针函数和函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能。

本文将介绍指针函数和函数指针的概念,并讲解一些常见的应用示例。

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。

逍遥自在学C语言 | 指针函数与函数指针

  • 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。

逍遥自在学C语言 | 指针函数与函数指针

二、指针函数

  • 指针函数是返回指针的函数,它的声明和定义与普通函数类似,但返回类型是一个指针类型。

  • 指针函数可以用于返回数组、字符串或动态分配的内存等。

  • 示例代码

#include <stdio.h>  int* getArray() {     static int arr[] = {1, 2, 3, 4, 5};     return arr; }  int main() {     int* ptr = getArray();      printf("Array elements: ");     for (int i = 0; i < 5; i++) {         printf("%d ", ptr[i]);     }      return 0; } 
  • 在上面的示例中,getArray()函数返回一个指向静态整数数组的指针

  • main()函数中,我们通过指针访问并打印数组的元素

  • 输出结果

Array elements: 1 2 3 4 5 

三、函数指针

  • 函数指针是指向函数的指针变量。

  • 通过函数指针,我们可以将函数作为参数传递给其他函数、在运行时动态选择要调用的函数等。

  • 示例代码

#include <stdio.h>  /* 加法运算 */ int add(int a, int b) {     return a + b; }  /* 减法运算 */ int subtract(int a, int b) {     return a - b; }  void calculate(int (*operation)(int, int), int a, int b) {     int result = operation(a, b);     printf("Result: %dn", result); }  int main() {     int x = 10, y = 5;      calculate(add, x, y);     calculate(subtract, x, y);      return 0; } 
  • 在上面的示例中,calculate()函数接受一个函数指针参数operation,该参数指向一个具有两个整数参数和整数返回值的函数。

  • main()函数中,我们使用calculate()函数来执行加法和减法运算。

  • 运行结果

Result: 15 Result: 5 

四、指针函数的应用

指针函数在以下情况下特别有用:

  • 动态分配内存:指针函数可以返回动态分配的内存,允许在运行时灵活地分配和释放内存。

  • 返回数组或字符串:通过指针函数,可以方便地返回数组或字符串,而无需将它们作为函数参数传递或使用全局变量。

  • 示例代码

#include <stdio.h> #include <stdlib.h> #include <string.h>  char* createString() {     char* str = (char*)malloc(sizeof(char) * 10);     strcpy(str, "Hello");     return str; }  int main() {     char* ptr = createString();     printf("String: %sn", ptr);     free(ptr);      return 0; } 
  • 在上面的示例中,createString()函数动态分配了一个大小为10的字符数组,并将字符串"Hello"复制到该数组中。

  • 然后,它返回该数组的指针。在main()函数中,我们打印并释放该字符串。

String: Hello 

五、函数指针的应用

函数指针具有以下应用场景:

  • 回调函数:函数指针可用于实现回调机制,其中一个函数作为参数传递给另一个函数,并在需要时被调用。

  • 运行时函数选择:函数指针允许根据运行时的条件选择要调用的函数,从而实现动态的程序行为。

  • 示例代码

#include <stdio.h>  void greet_english() {     printf("Hello!n"); }  void greet_spanish() {     printf("Hola!n"); }  void greet_french() {     printf("Bonjour!n"); }  int main() {     int choice;      // 声明函数指针,并初始化为NULL     void (*greet)() = NULL;      printf("请选择要使用的语言:n");     printf("1. 英语n");     printf("2. 西班牙语n");     printf("3. 法语n");     printf("n请输入对应的数字:");     scanf("%d", &choice); 	printf("n");     // 根据用户的选择设置函数指针     if (choice == 1) {         greet = greet_english;     } else if (choice == 2) {         greet = greet_spanish;     } else if (choice == 3) {         greet = greet_french;     } else {         printf("无效的选择!n");         return 0;     }      // 如果函数指针不为NULL,则调用相应的函数     if (greet != NULL) {         greet();     }      return 0; }  
  • 在这个例子中,我们定义了三个不同的打招呼函数:greet_englishgreet_spanishgreet_french
  • main函数中,我们声明了一个函数指针greet,并将其初始化为NULL
  • 用户可以选择要使用的语言,然后根据选择将函数指针greet设置为相应的函数地址。
  • 最后,如果函数指针不为NULL,则调用相应的函数。
  • 运行结果
请选择要使用的语言: 1. 英语 2. 西班牙语 3. 法语  请输入对应的数字:3  Bonjour! 

小结

通过这篇文章,我们学会了

1、指针函数的概念

2、函数指针的概念

3、指针函数的应用

4、函数指针的应用

📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!

发表评论

评论已关闭。

相关文章