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

小鱼儿 2022-06-12 11:07 412阅读 0赞

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、会作为实际参数使用的函数叫回调函数

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

函数指针练习:

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

回调函数练习1:

  1. /*
  2. * 回调函数
  3. * */
  4. #include <stdio.h>
  5. /*
  6. void print(int *p_num, int size) {
  7. int num = 0;
  8. for(num = 0; num <= size - 1; num++) {
  9. printf("%d ", *(p_num + num));
  10. }
  11. printf("\n");
  12. }
  13. */
  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. }
  25. //实现相反数
  26. void opposite(int *p_num) {
  27. *p_num = 0 - *p_num;
  28. }
  29. int main() {
  30. int arr[] = {
  31. 1, 2, 3, 4, 5};
  32. // print(arr, 5);
  33. for_each(arr, 5, opposite);
  34. for_each(arr, 5, print_cb);//使两个函数链接
  35. printf("\n");
  36. return 0;
  37. }

回调函数练习2:

  1. /*
  2. *编写函数从两个圆里找到较大的并传回调用函数
  3. * 函数没有返回值
  4. * */
  5. #include <stdio.h>
  6. #define PI 3.14f
  7. typedef struct {
  8. int row;
  9. int col;
  10. } pt;
  11. typedef struct {
  12. pt center;
  13. int radius;
  14. } circle;
  15. void larger(const circle *p_cl1, const circle *p_cl2, circle **pp_cl) {
  16. *pp_cl =(circle*) (p_cl1-> radius > p_cl2->radius ? p_cl1 : p_cl2);
  17. }
  18. int main() {
  19. circle cl1 = {0}, cl2 = {0}, *p_cl = NULL;
  20. printf("请输入第一个圆的半径:\n");
  21. scanf("%d%d%d", &(cl1.center.row), &(cl1.center.col), &(cl1.radius));
  22. printf("请输入第二个圆的半径:\n");
  23. scanf("%d%d%d", &(cl2.center.row), &(cl2.center.col), &(cl2.radius));
  24. larger(&cl1, &cl2, &p_cl);
  25. printf("(%d,%d)%d\n",p_cl->center.row, p_cl->center.col, p_cl->radius);
  26. return 0;
  27. }

二级指针演示:

  1. /*
  2. *二级指针演示
  3. * */
  4. #include <stdio.h>
  5. int main() {
  6. int num = 0;
  7. int *p_num = &num;
  8. int **pp_num = &p_num; //二级指针的定义和初始化
  9. **pp_num = 10;
  10. printf("num的值是:%d\n", num);
  11. *pp_num = NULL;
  12. printf("p_num是%p\n",p_num);
  13. return 0;
  14. }

二级指针练习:

  1. /* * 编写函数使主函数的地址成空地址 * 二级指针 * */
  2. #include <stdio.h>
  3. void set_null(int **pp_num) {
  4. //定义一个二级指针形式参数
  5. *pp_num = NULL; // 使主函数成空指针
  6. }
  7. int main() {
  8. int num = 0;
  9. int *p_num = &num;
  10. set_null(&p_num);
  11. printf("p_num的地址是:%p\n", p_num);
  12. return 0;
  13. }

发表评论

表情:
评论列表 (有 0 条评论,412人围观)

还没有评论,来说两句吧...

相关阅读