【C语言】二级指针,函数指针,回调函数

20、用来记录普通变量的地址的指针叫做一级指针

21、二级指针可以记录一级指针的地址

22、声明二级指针是需要在指针变量前加**

23、二级指针变量名称前加**可以表示捆绑的普通存储区

24、二级指针变量名称前加*可以表示捆绑的一级指针存储区

25、二级指针可以代表数组但不能代表二维数组

26、无类型指针有可能记录一级指针的地址,这个时候需要强制转换为二级指针后使用

27、二级指针通常作为形式参数使用,使用二级指针形参可以让被掉函数想调用函数传递一个地址数据

28、C语言里函数也是地址

29、函数名称可以用来表示函数的地址

30、函数指针用来记录函数的地址

31、函数指针也需要先声明后使用

32、函数指针的声明可以根据函数声明的变化得到

int (*p_func)(int,int) = NULL;//函数指针声明

33、函数指针也分类型,不同格式的函数适合与不同类型的函数指针捆绑

34、函数指针可以用来调用函数.
printf(“结果是:%d\n”,p_func(4,7));//函数指针的调用,跟调用函数一样

35、函数指针可以作为形参使用的

36、会作为实际参数使用的函数叫回调函数

         14 //实现显示
         15 void print_cb(int *p_num) {
         16     printf("%d ", *p_num);
         17 }
         18 //实现循环
         19 void for_each(int *p_num, int size, void (*p_func)(int*)) {
         20     int num = 0;
         21     for(num = 0; num <= size - 1; num++) {
         22         p_func(p_num + num);
         23     }
         24 }
         29 int main() {
         30     int arr[] = {1, 2, 3, 4, 5};
         33     for_each(arr, 5, print_cb);//使两个函数链接
         34     printf("\n");
         35     return 0;
         36 }

函数指针练习:

/*
 * 函数指针
 *
 * */
#include <stdio.h>
int add (int num, int num1) {
    return num + num1;
}
int main() {
    int (*p_func)(int,int) = NULL;//函数指针声明
    p_func = add; //将函数赋值给函数指针
    printf("add是:%p\n", add);
    printf("结果是:%d\n",p_func(4,7));//函数指针的调用,跟调用函数一样`
    return 0;
}

回调函数练习1:

/*
 * 回调函数
 * */
#include <stdio.h>
/*
void print(int *p_num, int size) {
    int num = 0;
    for(num = 0; num <= size - 1; num++) {
        printf("%d ", *(p_num + num));
    }
    printf("\n");
}
*/
//实现显示
void print_cb(int *p_num) {
    printf("%d ", *p_num); 
}
//实现循环
void for_each(int *p_num, int size, void (*p_func)(int*)) {
    int num = 0;
    for(num = 0; num <= size - 1; num++) {
        p_func(p_num + num);
    }
}
//实现相反数
void opposite(int *p_num) {
    *p_num = 0 - *p_num;    
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
   // print(arr, 5);
    for_each(arr, 5, opposite);
    for_each(arr, 5, print_cb);//使两个函数链接
    printf("\n");
    return 0;
}

回调函数练习2:

/*
 *编写函数从两个圆里找到较大的并传回调用函数
 * 函数没有返回值
 * */
#include <stdio.h>
#define PI 3.14f
typedef struct {
    int row;
    int col;
} pt;

typedef struct {
    pt center;
    int radius;
} circle;

void larger(const circle *p_cl1, const circle *p_cl2, circle **pp_cl) {
    *pp_cl =(circle*) (p_cl1-> radius > p_cl2->radius ? p_cl1 : p_cl2);
}
int main() {
    circle cl1 = {0}, cl2 = {0}, *p_cl = NULL;
    printf("请输入第一个圆的半径:\n");
    scanf("%d%d%d", &(cl1.center.row), &(cl1.center.col), &(cl1.radius));
    printf("请输入第二个圆的半径:\n");
    scanf("%d%d%d", &(cl2.center.row), &(cl2.center.col), &(cl2.radius));
    larger(&cl1, &cl2, &p_cl);
    printf("(%d,%d)%d\n",p_cl->center.row, p_cl->center.col, p_cl->radius);
    return 0;
}

二级指针演示:

/*
 *二级指针演示
 * */
#include <stdio.h>
int main() {
    int num = 0;
    int *p_num = &num;
    int **pp_num = &p_num; //二级指针的定义和初始化
    **pp_num = 10;
    printf("num的值是:%d\n", num);
    *pp_num = NULL;
    printf("p_num是%p\n",p_num);
    return 0;
}

二级指针练习:

/*
 * 编写函数使主函数的地址成空地址
 * 二级指针
 * */
#include <stdio.h>
void set_null(int **pp_num) {//定义一个二级指针形式参数
    *pp_num = NULL; // 使主函数成空指针
}
int main() {
    int num = 0;
    int *p_num = &num;
    set_null(&p_num);
    printf("p_num的地址是:%p\n", p_num);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘星燎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值