C语言中函数指针和普通指针的区别是什么

来源:站长源码作者:湖南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《C语言中函数指针和普通指针的区别是什么》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C语言中函数指针和普通指针的区别是什么》有用,将其分享出去将是对创作者最好的鼓励。

在C语言编程中,指针是核心知识点之一,其中函数指针和普通指针是两种常见的指针类型,二者在定义、存储内容、使用方式等方面存在明显差异,下面我们来详细分析。

C语言中函数指针和普通指针的区别是什么

一、定义与存储内容不同

普通指针是用来存储变量地址的指针,它指向的是内存中存放具体数据的存储单元,通过普通指针可以访问或修改对应地址中的数据。而函数指针是用来存储函数入口地址的指针,它指向的是内存中存放函数代码的首地址,通过函数指针可以调用对应的函数。

我们可以用如下代码来区分二者的定义:

#include <stdio.h>

int num = 10;  // 普通整型变量
int add(int a, int b) {  // 普通函数
    return a + b;
}

int main() {
    int *normal_ptr = #  // 普通指针,存储num的地址
    int (*func_ptr)(int, int) = add;  // 函数指针,存储add函数的入口地址
    return 0;
}

二、操作方式不同

普通指针支持解引用、指针运算(如加减操作、比较操作)等操作,通过这些操作可以访问或修改指向的变量值,也可以移动指针指向不同的内存单元。而函数指针不支持解引用和指针运算,它的核心操作是通过指针调用对应的函数。

下面是对应的操作示例:

#include <stdio.h>

int num = 10;
int add(int a, int b) {
    return a + b;
}

int main() {
    int *normal_ptr = #
    int (*func_ptr)(int, int) = add;
    
    // 普通指针操作
    printf("普通指针解引用结果:%dn", *normal_ptr);  // 输出10
    *normal_ptr = 20;  // 修改指向的变量值
    printf("修改后num的值:%dn", num);  // 输出20
    normal_ptr++;  // 指针运算,指向num后面的内存单元
    
    // 函数指针操作
    int result = func_ptr(3, 5);  // 通过函数指针调用add函数
    printf("函数指针调用结果:%dn", result);  // 输出8
    return 0;
}

三、使用场景不同

普通指针的使用场景非常广泛,比如动态内存分配、数组操作、函数参数传递(传递变量的地址实现修改实参)等,主要作用是间接访问内存中的数据。

函数指针的常见使用场景包括回调函数实现、函数表设计、插件架构开发等,它的核心价值是将函数作为参数传递或者存储,实现更灵活的代码逻辑。

下面是一个简单的回调函数示例,体现函数指针的使用场景:

#include <stdio.h>

// 定义回调函数类型
typedef int (*callback)(int, int);

// 接收函数指针作为参数的函数
void process_data(int a, int b, callback func) {
    int result = func(a, b);
    printf("处理结果:%dn", result);
}

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

int main() {
    process_data(2, 3, add);  // 传入add函数作为回调
    process_data(2, 3, multiply);  // 传入multiply函数作为回调
    return 0;
}

四、类型匹配要求不同

普通指针的类型需要和它指向的变量类型严格匹配,比如int*类型的指针只能指向int类型的变量,否则会出现类型不兼容的问题,虽然在强制类型转换后可以指向其他类型,但可能会导致数据访问错误。

函数指针的类型需要和它指向的函数的返回值类型、参数个数、参数类型完全匹配,否则无法通过编译。比如返回int、接收两个int参数的函数,只能赋值给同样签名的函数指针。

总结

综上,函数指针和普通指针的核心区别可以归纳为以下几点:存储内容不同,普通指针存变量地址,函数指针存函数入口地址;操作方式不同,普通指针支持解引用和运算,函数指针仅用于调用函数;使用场景不同,普通指针用于数据访问,函数指针用于函数传递;类型匹配要求不同,二者的类型匹配规则分别对应变量和函数的类型规则。

函数指针普通指针C语言指针区别修改时间:2026-06-13 04:45:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。