博客
关于我
C++之指针探究(八):指针函数和函数指针
阅读量:223 次
发布时间:2019-02-28

本文共 2471 字,大约阅读时间需要 8 分钟。

指针函数与函数指针入门

一、指针函数

在C语言中,函数的返回值可以是基本数据类型,如整型、浮点型等,也可以是指针类型的数据。返回指针类型数据的函数称为指针函数。其定义方式与指针变量类似,只需在函数的定义中在类型后面加上星号即可。

注意事项

  • 局部变量的地址不要作为函数返回值:函数返回局部变量的地址会导致内存泄漏或其他问题。
  • 指针函数:指的是返回指针变量的函数,其返回值是字符指针类型或其他指针类型。

示例1

char* getWord(char c) {    switch(c) {        case 'A': return "Apple";        case 'B': return "Banana";        case 'C': return "Cat";        case 'D': return "Dog";        default: return "None";    }}
  • 运行结果:输入字符会返回对应单词的首字符地址。
  • 分析
    • char* getWord(char c) 表明返回值是字符指针类型。
    • "Apple" 返回的是字符串的第一个字符地址。

附例1代码

#include 
char* getWord(char c) { switch(c) { case 'A': return "Apple"; case 'B': return "Banana"; case 'C': return "Cat"; case 'D': return "Dog"; default: return "None"; }}int main() { char input; printf("请输入一个字符: "); scanf("%c", &input); printf("%s\n", getWord(input)); return 0;}

二、函数指针

函数指针是指向函数的指针。函数名在表达式中被解读为指向该函数的指针地址。通过函数名赋值给函数指针变量即可调用对应函数。

函数指针的使用

  • 函数指针声明:如 void (*p)();,表示 p 是一个函数指针,指向返回值为 void 的函数。
  • 函数指针调用:如 p();,通过 p 调用目标函数。
  • 示例2

    void fun() {    printf("hello, world\n");}int main() {    printf("函数名为:%p\n", fun);    void (*p)();    p = fun;    p();    printf("函数指针p为:%p\n", p);    printf("函数指针*p为:%p\n", *p);    return 0;}

    注意事项

    • 函数指针的赋值:可以直接使用函数名赋值给函数指针,如 p = fun;p = &fun;,效果相同。
    • 函数名与数组名的区别:函数名作为右值时不需要取地址,而数组名作为右值时需要。

    三、函数指针作为参数

    函数指针可以作为参数传递给函数,实现灵活的功能扩展。

    示例3

    int square(int num) {    return num * num;}int main() {    int num;    printf("请输入一个整数: ");    scanf("%d", &num);    int (*fp)(int) = square;    printf("%d * %d = %d\n", num, num, (*fp)(num));    return 0;}

    注意事项

    • 函数指针传递:如 fp(num) 也可以写成 (*fp)(num)
    • 可选写法fp = square;fp = □ 效果相同。

    四、一个函数能否有时候返回整型指针,有时候返回字符指针?

    可以通过条件控制返回值类型。例如,根据输入判断返回整型指针还是字符指针。

    示例4

    void* func(int n, int* ptr, char* str) {    if (n > 0) {        return ptr;    } else {        return str;    }}int main() {    int num = 520;    char *str = "FishC";    printf("%d\n", (int*)func(1, &num, str));    printf("%s\n", (char*)func(-1, &num, str));    return 0;}

    注意事项

    • 返回类型统一:函数返回类型为 void*,适用于多种数据类型。
    • 类型转换:根据返回值类型进行适当的类型转换。

    五、函数指针作为返回值

    函数指针可以作为返回值,实现对不同函数的统一调用。

    示例5

    int add(int a, int b) {    return a + b;}int sub(int a, int b) {    return a - b;}int calc(int (*fp)(int, int), int a, int b) {    return (*fp)(a, b);}int main() {    printf("1 + 2 = %d\n", calc(add, 1, 2));    printf("3 - 6 = %d\n", calc(sub, 3, 6));    return 0;}

    注意事项

    • 函数指针返回calc 函数返回调用目标函数的结果。
    • 参数传递:函数指针的参数类型需与目标函数一致。

    总结

    指针函数和函数指针是C语言中非常重要的概念,广泛应用于内存操作、函数调用等多个领域。通过合理使用函数指针,可以实现函数的灵活调用和扩展功能。

    转载地址:http://qihp.baihongyu.com/

    你可能感兴趣的文章
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>