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

C语言-函数指针与指针函数的区别

函数指针与指针函数的区别

在C语言和C++语言中,函数指针和指针函数是两个容易混淆的概念。它们的含义、语法和用途有很大区别。以下是详细的对比和解释。

1.函数指针

1.1定义

函数指针是一个指针,它指向一个函数的入口地址。通过函数指针,可以像调用普通函数一样调用它所指向的函数。

1.2语法

假设有一个函数 void func(int a),函数指针的声明方式为:

cvoid (*func_ptr)(int);

这里,func_ptr 是一个函数指针,它指向一个返回值为 void 、参数为一个 int 的函数。

1.3用途

函数指针常用于以下场景:

• 回调函数:例如在事件处理、异步编程中,将函数指针作为参数传递给其他函数。

• 函数表:通过数组存储多个函数指针,实现函数的动态调用。

• 算法模板:如 qsort 函数,通过函数指针比较元素。

1.4示例代码

#include <stdio.h>

void print_int(int x) {
    printf("The integer is: %d\n", x);
}

void print_double(double x) {
    printf("The double is: %f\n", x);
}

int main() {
    void (*func_ptr)(int); // 声明一个函数指针
    func_ptr = print_int;  // 将函数指针指向 print_int 函数
    func_ptr(10);          // 通过函数指针调用函数

    return 0;

}

2.指针函数

2.1定义

指针函数是一个返回值为指针的函数。它的本质仍然是一个函数,只不过它的返回值是一个指针类型。

2.2语法

如果有一个函数返回一个指向 int 的指针,声明方式为:

cint* func();

这里, func 是一个函数,它的返回值是一个指向 int 的指针。

2.3用途

指针函数常用于以下场景:

• 动态分配内存:返回一个指向动态分配内存的指针。

• 链表操作:返回链表的头指针或某个节点的指针。

• 数组操作:返回数组的首地址或某个特定位置的指针。

2.4示例代码

#include <stdio.h>
#include <stdlib.h>

int* create_array(int size) {
    int* arr = (int*)malloc(size * sizeof(int));
    for (int i = 0; i < size; i++) {
        arr[i] = i * i;
    }
    return arr; // 返回指向数组的指针
}

int main() {
    int* arr = create_array(5); // 调用指针函数
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    free(arr); // 释放动态分配的内存
    return 0;
}

3.区别

3.1本质不同

• 函数指针:是一个指针,它指向一个函数的入口地址。

• 指针函数:是一个函数,它的返回值是一个指针。

3.2声明方式不同

• 函数指针: void (*func_ptr)(int);

• 指针函数: int* func();

3.3使用方式不同

• 函数指针:用于通过指针调用函数。

• 指针函数:用于返回一个指针,通常用于动态分配内存或操作指针。

3.4应用场景不同

• 函数指针:常用于回调、函数表、算法模板等。

• 指针函数:常用于动态内存分配、链表操作、数组操作等。

4.总结

函数指针和指针函数虽然名字相似,但它们的含义、语法和用途完全不同。理解它们的区别对于编写高效、灵活的代码非常重要。可参考以上解释进行区分,以便使用。

相关文章:

  • ChatGPT结合DeepSeek新式文献获取+文献拆解流程分享!学术论文轻松上岸!
  • SCI1区TOP:自适应学习粒子群算法SLPSO,深度解析+性能实测
  • 【孟德尔随机化】PhenoScanner不能用的,替代方法
  • PPT 技能:巧用 “节” 功能,让演示文稿更有序
  • 使用 Arduino 的 WiFi 控制机器人
  • 【人工智能】【Python】在Scikit-Learn中使用KNN(K最近邻算法)
  • Ruoyi+uniapp+websocket点对点和广播通知消息
  • 分享几个论文校对相关的deepseek提示词
  • Linux脚本编程
  • python基础课程整理--字典的基础
  • 图像滑块对比功能的开发记录
  • 芋道打包时报错:缺失@unocss插件
  • WLAN无线组网 WI-FI
  • 使用 Python pandas操作 Excel 文件
  • leetcode0020 - 有效的括号 easy
  • 精选一百道备赛蓝桥杯——2.K倍区间
  • YOLOv10改进之MHAF(多分支辅助特征金字塔)
  • BookChatApp通用书籍阅读APP
  • 云渲染技术在影视特效制作中的核心优势
  • Spring AI+硅基流动DeepSeek语音识别全栈方案:从FFmpeg预处理到分布式推理
  • 夜读丨永不掉电的陪伴
  • 可显著提高公交出行率,山东、浙江多县常态化实施城区公交免费
  • 俄美元首通话超2小时,普京称愿与乌方共同起草和平备忘录
  • 大巴车高速上撞山致2死2伤,广东肇庆警方通报
  • 让中小学生体验不同职业,上海中高职院校提供超5万个体验名额
  • 专访|金七猫奖得主:以非遗为舟,在现实题材中疗愈与成长