当前位置: 首页 > ai >正文

C语言高频面试题——指针函数和函数指针的区别

在 C 语言中,指针函数函数指针 是两个容易混淆的概念,但它们的功能和用途完全不同。以下是详细的对比分析,帮助你彻底理解它们的区别。


1. 指针函数(Function Returning a Pointer)

定义
  • 指针函数 是一个返回值为指针类型的函数。
  • 它本质上是一个普通函数,只是其返回值是指向某种数据类型的指针。
语法
type* functionName(parameters);
  • type*:返回值类型是指针。
  • functionName:函数名。
  • parameters:函数的参数列表。
特点
  1. 返回值是一个指针。
  2. 可以通过返回的指针访问或修改内存中的数据。
  3. 常用于动态内存分配、字符串操作等场景。
示例
#include <stdio.h>// 指针函数:返回一个指向整型的指针
int* getMaxPointer(int* a, int* b) {return (*a > *b) ? a : b;
}int main() {int x = 10, y = 20;int* ptr = getMaxPointer(&x, &y); // 返回指向较大值的指针printf("Max value: %d\n", *ptr);  // 输出 20return 0;
}
使用场景
  • 动态分配内存并返回指针:
    int* allocateMemory(int size) {return malloc(size * sizeof(int));
    }
    
  • 返回数组或字符串的一部分:
    char* getSubstring(char* str, int start, int len) {char* result = malloc(len + 1);strncpy(result, str + start, len);result[len] = '\0';return result;
    }
    

2. 函数指针(Pointer to Function)

定义
  • 函数指针 是一个指向函数的指针变量。
  • 它存储的是函数的入口地址,可以通过函数指针调用对应的函数。
语法
return_type (*pointer_name)(parameter_types);
  • return_type:函数的返回值类型。
  • (*pointer_name):函数指针的名称。
  • parameter_types:函数的参数类型列表。
特点
  1. 存储的是函数的地址。
  2. 可以通过函数指针调用函数。
  3. 常用于回调函数、函数表、动态选择函数等场景。
示例
#include <stdio.h>// 两个简单的函数
int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int main() {// 定义函数指针int (*operation)(int, int);// 将函数指针指向不同的函数operation = add;printf("Add: %d\n", operation(5, 3)); // 输出 8operation = subtract;printf("Subtract: %d\n", operation(5, 3)); // 输出 2return 0;
}
使用场景
  • 回调函数:
    void execute(int (*callback)(int, int), int a, int b) {printf("Result: %d\n", callback(a, b));
    }int multiply(int a, int b) {return a * b;
    }int main() {execute(multiply, 4, 5); // 输出 20return 0;
    }
    
  • 函数表(如状态机实现):
    int add(int a, int b) { return a + b; }
    int subtract(int a, int b) { return a - b; }int main() {int (*operations[2])(int, int) = {add, subtract};printf("Add: %d\n", operations[0](5, 3));       // 输出 8printf("Subtract: %d\n", operations[1](5, 3)); // 输出 2return 0;
    }
    

3. 核心区别总结

特性指针函数函数指针
定义返回值为指针的函数指向函数的指针变量
语法type* functionName(parameters)return_type (*pointer_name)(parameters)
本质普通函数,返回指针存储函数地址,用于调用函数
使用场景动态内存分配、返回复杂数据结构回调函数、函数表、动态选择函数
示例int* getMaxPointer(int* a, int* b)int (*operation)(int, int);

4. 示例对比

指针函数
char* getString() {static char str[] = "Hello, World!";return str;
}int main() {char* message = getString();printf("%s\n", message); // 输出 "Hello, World!"return 0;
}
函数指针
void greet() {printf("Hello!\n");
}int main() {void (*funcPtr)() = greet; // 函数指针指向 greetfuncPtr(); // 调用 greet 函数return 0;
}

5. 注意事项

  1. 指针函数

    • 确保返回的指针有效(避免返回局部变量的地址)。
    • 示例错误:
      char* getString() {char str[] = "Hello"; // 局部变量return str; // 错误:返回悬空指针
      }
      
  2. 函数指针

    • 确保函数指针与目标函数的签名匹配。
    • 示例错误:
      int add(int a, int b) { return a + b; }
      void (*funcPtr)() = add; // 错误:签名不匹配
      

6. 总结

  • 指针函数:一个返回指针的函数,重点在于返回值。
  • 函数指针:一个指向函数的指针变量,重点在于调用函数。
http://www.xdnf.cn/news/1124.html

相关文章:

  • 【Java面试笔记:基础】4.强引用、软引用、弱引用、幻象引用有什么区别?
  • 【c++深入系列】:万字string详解(附有sso优化版本的string模拟实现源码)
  • rpm命令详解
  • java的反编译命令
  • 小小矩阵设计
  • 重学React(一):描述UI
  • 【Python进阶】数据可视化:Matplotlib从入门到实战
  • 解码思维链:AI思维链如何重塑人类与机器的对话逻辑
  • 解决 MongoDB 查询中的 `InvalidMongoDbApiUsageException` 错误
  • 密码学货币混币器详解及python实现
  • ASP.Net Web Api如何更改URL
  • 【前端】【业务逻辑】【面试】 大数据表格的表单校验导致性能问题,如何优化?
  • 【Nova UI】七、SASS 全局变量体系:组件库样式开发的坚固基石
  • 【Unity MetaQuest】Unity6使用Meta all in one sdk打包安装到Quest2设备后,运行后闪退或者一直卡在3个点上解决办法
  • ViewBS 的工作流程
  • GitHub 常见高频问题与解决方案(实用手册)
  • 【质量管理】“武藏曲线”和“微笑曲线”的差异
  • 【第16届蓝桥杯C++C组】--- 2025图形
  • CentOS 6.9 安装 Zabbix 3.0 详细教程
  • uniapp Vue2升级到Vue3,并发布到微信小程序的快捷方法
  • CSS学习笔记
  • Ubuntu数据连接访问崩溃问题
  • 百度 Al 智能体心响 App 上线
  • \r在C语言中是什么意思(通俗易懂,附带实例)
  • C语言高频面试题——嵌入式系统中中断服务程序
  • Python基于语音识别的智能垃圾分类系统【附源码、文档说明】
  • 如何批量为多个 Word 文档添加水印保护
  • C++手撕STL-其叁
  • MongoDB 集合名称映射问题
  • 【Lua】Lua 入门知识点总结