C语言学习笔记七. 指针函数、函数指针、函数类型

七. 指针函数、函数指针、函数类型

1. 指针函数

概念:返回值类型为指针的函数,本质是函数

模型:int *a(int i, int j);

2.函数指针

概念:本质是指针,存储函数的地址; 函数名就是函数的地址。

int add(int p, int q);
    //函数的类型为:int ()(int p, int q)  == int ()( int, int)
    //&add或add 都是可以表示函数的地址,类型为:int (*)( int, int)
定义函数指针存储函数地址:
        int (*p)( int, int) = add; //p==add
​
        直接调用函数:int num = add(10, 20);
        通过函数指针调用函数:  int num = p(10, 20);
    
示例代码:
#include <stdio.h>
#include <strings.h>
​
int add(int a, int b);
​
int main(int argc, const char*argv[])
{
    int (*p)( int, int) = add;
​
    //通过函数指针调用函数: 
    int num = p(10, 200);
    printf("num:%d\n", num);
    
    return 0;
}
​
int add(int a, int b)
{
    return a+b;
}

3.函数分类

①. 变参函数:函数调用时,实参个数是可以改变的,一般在系统里面使用

例如:printf函数,scanf函数;

②. 回调函数:母函数和子函数,子函数由使用者去实现,母函数代码一般是不可见的 ,只提供函数接口。

#include <stdio.h>
#include <strings.h>
​
int func(int (*p)(int, int), int num1, int num2);//用来调用子函数
​
//子函数
int add(int a, int b);
//子函数
int reduce(int a, int b);
​
int main(int argc, const char*argv[])
{
    
    int num = func(add, 100, 200);
    
    printf("num:%d\n", num);
    
    
    num = func(reduce, 100, 200);
    
    printf("num:%d\n", num);
    return 0;
}
//子函数
int add(int a, int b)
{
    
    return a+b;
}
//子函数
int reduce(int a, int b)
{
    
    return a-b;
}
​
//母函数 --> 实现两个数的运算,运算规则可以你自己实现
/*  函数功能:实现两个数的运算,例如:加法、减法...
    形参作用:
            p  --》函数指针,你要运算的规则,可以写在这个函数里面
            num1、num2要运算的两个数
            
    返回值:返回运算结果      
*/
int func(int (*p)(int, int), int num1, int num2)
{
    
    //通过函数指针调用函数
    int num = p(num1, num2);
    
    return num;
}   
​

③. 内联函数:在某些情况下,有些函数会被调用非常频繁,函数代码非常精简,为了节省这个现场保护和现场恢复的时间, 就可以把函数声明为内联函数,在编译阶段,他会把函数的代码编译到被调用的函数里面,调用该函数时,就不需要跳转; 但是内联函数声明后,不一定会实现,具体要看编译器的判断。

示例代码:
#include <stdio.h>
#include <strings.h>
​
inline int add(int a, int b);
​
int main(int argc, const char*argv[])
{
    int num = add(100, 200);
    printf("num:%d\n", num);
    return 0;
}
​
inline int add(int a, int b)
{
    return a+b;
}
​

④. 递归函数:自己调用自己

使用递归函数必须要有结束条件,否则他会一直运算下去直到内存爆了为止。

示例代码:  计算某个数的阶乘
#include <stdio.h>
#include <strings.h>
​
int func(int num);
​
int main(int argc, const char*argv[])
{
    
    int num;
    scanf("%d", &num);
    
    int sum = func(num);
    printf("sum:%d\n", sum);
    
    
    return 0;
}
​
int func(int num)
{
    
    if(num == 1 || num == 0)
        return 1;
    
    int sum = num*func(num-1);
    
    return sum;
}
​
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值