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

打印 上一主题 下一主题

主题 1905|帖子 1905|积分 5715

前言

在C语言中,指针函数和函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能。
本文将介绍指针函数和函数指针的概念,并讲解一些常见的应用示例。
一、人物简介


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


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

二、指针函数


  • 指针函数是返回指针的函数,它的声明和定义与普通函数类似,但返回类型是一个指针类型。
  • 指针函数可以用于返回数组、字符串或动态分配的内存等。
  • 示例代码
  1. #include <stdio.h>
  2. int* getArray() {
  3.     static int arr[] = {1, 2, 3, 4, 5};
  4.     return arr;
  5. }
  6. int main() {
  7.     int* ptr = getArray();
  8.     printf("Array elements: ");
  9.     for (int i = 0; i < 5; i++) {
  10.         printf("%d ", ptr[i]);
  11.     }
  12.     return 0;
  13. }
复制代码

  • 在上面的示例中,getArray()函数返回一个指向静态整数数组的指针
  • 在main()函数中,我们通过指针访问并打印数组的元素
  • 输出结果
  1. Array elements: 1 2 3 4 5
复制代码
三、函数指针


  • 函数指针是指向函数的指针变量。
  • 通过函数指针,我们可以将函数作为参数传递给其他函数、在运行时动态选择要调用的函数等。
  • 示例代码
  1. #include <stdio.h>
  2. /* 加法运算 */
  3. int add(int a, int b) {
  4.     return a + b;
  5. }
  6. /* 减法运算 */
  7. int subtract(int a, int b) {
  8.     return a - b;
  9. }
  10. void calculate(int (*operation)(int, int), int a, int b) {
  11.     int result = operation(a, b);
  12.     printf("Result: %d\n", result);
  13. }
  14. int main() {
  15.     int x = 10, y = 5;
  16.     calculate(add, x, y);
  17.     calculate(subtract, x, y);
  18.     return 0;
  19. }
复制代码

  • 在上面的示例中,calculate()函数接受一个函数指针参数operation,该参数指向一个具有两个整数参数和整数返回值的函数。
  • 在main()函数中,我们使用calculate()函数来执行加法和减法运算。
  • 运行结果
  1. Result: 15
  2. Result: 5
复制代码
四、指针函数的应用

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

  • 动态分配内存:指针函数可以返回动态分配的内存,允许在运行时灵活地分配和释放内存。
  • 返回数组或字符串:通过指针函数,可以方便地返回数组或字符串,而无需将它们作为函数参数传递或使用全局变量。
  • 示例代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char* createString() {
  5.     char* str = (char*)malloc(sizeof(char) * 10);
  6.     strcpy(str, "Hello");
  7.     return str;
  8. }
  9. int main() {
  10.     char* ptr = createString();
  11.     printf("String: %s\n", ptr);
  12.     free(ptr);
  13.     return 0;
  14. }
复制代码

  • 在上面的示例中,createString()函数动态分配了一个大小为10的字符数组,并将字符串"Hello"复制到该数组中。
  • 然后,它返回该数组的指针。在main()函数中,我们打印并释放该字符串。
  1. String: Hello
复制代码
五、函数指针的应用

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

  • 回调函数:函数指针可用于实现回调机制,其中一个函数作为参数传递给另一个函数,并在需要时被调用。
  • 运行时函数选择:函数指针允许根据运行时的条件选择要调用的函数,从而实现动态的程序行为。
  • 示例代码
  1. #include <stdio.h>
  2. void greet_english() {
  3.     printf("Hello!\n");
  4. }
  5. void greet_spanish() {
  6.     printf("Hola!\n");
  7. }
  8. void greet_french() {
  9.     printf("Bonjour!\n");
  10. }
  11. int main() {
  12.     int choice;
  13.     // 声明函数指针,并初始化为NULL
  14.     void (*greet)() = NULL;
  15.     printf("请选择要使用的语言:\n");
  16.     printf("1. 英语\n");
  17.     printf("2. 西班牙语\n");
  18.     printf("3. 法语\n");
  19.     printf("\n请输入对应的数字:");
  20.     scanf("%d", &choice);
  21.         printf("\n");
  22.     // 根据用户的选择设置函数指针
  23.     if (choice == 1) {
  24.         greet = greet_english;
  25.     } else if (choice == 2) {
  26.         greet = greet_spanish;
  27.     } else if (choice == 3) {
  28.         greet = greet_french;
  29.     } else {
  30.         printf("无效的选择!\n");
  31.         return 0;
  32.     }
  33.     // 如果函数指针不为NULL,则调用相应的函数
  34.     if (greet != NULL) {
  35.         greet();
  36.     }
  37.     return 0;
  38. }
复制代码

  • 在这个例子中,我们定义了三个不同的打招呼函数:greet_english、greet_spanish和greet_french。
  • 在main函数中,我们声明了一个函数指针greet,并将其初始化为NULL。
  • 用户可以选择要使用的语言,然后根据选择将函数指针greet设置为相应的函数地址。
  • 最后,如果函数指针不为NULL,则调用相应的函数。
  • 运行结果
  1. 请选择要使用的语言:
  2. 1. 英语
  3. 2. 西班牙语
  4. 3. 法语
  5. 请输入对应的数字:3
  6. Bonjour!
复制代码
小结

通过这篇文章,我们学会了
1、指针函数的概念
2、函数指针的概念
3、指针函数的应用
4、函数指针的应用
<blockquote>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表