【C++】深入理解函数指针

举报
王博Kings 发表于 2020/12/29 23:13:52 2020/12/29
【摘要】 目录 第1部分: 第1.1 回顾函数定义 第1.2 一个函数指针 1.2.1程序示例  1.3 函数指针数组  第1部分: 第1.1 回顾函数定义 首先来看,下面3个表示的特征标和返回类型都是相同的 括号里面: const double ar[]  与const double *ar 含义完全相同,函数原型中,可以省略 标识符 const...

目录

第1部分:

第1.1 回顾函数定义

第1.2 一个函数指针

1.2.1程序示例 

1.3 函数指针数组 


第1部分:

第1.1 回顾函数定义

首先来看,下面3个表示的特征标和返回类型都是相同的

括号里面:

const double ar[]  与const double *ar 含义完全相同,函数原型中,可以省略 标识符

const double ar[]可以简化为const double []

const double *ar可以简化为const double *

括号外面:函数定义必须提供标识符,因此必须使用const double ar[] 或者  const double * ar

第1.2 一个函数指针

假设要声明一个指针,指向三个函数中的一个,指针名为pa, 则将函数名替换为(*pa)

进一步我们看一下使用:

注意:原型是double * f1

所以这里的输出前一项是double的地址,后一项才是存储的值

*(*p1)(av,3) 和  *p2(av,3)这个前面 的*用来解析地址输出值

1.2.1程序示例 


  
  1. //arfupt.cpp -- 数组函数指针
  2. #include<iostream>
  3. using namespace std;
  4. // 相同的声明
  5. const double * f1(const double ar[], int n);
  6. const double * f2(const double ar[], int n);
  7. const double * f3(const double ar[], int n);
  8. int main()
  9. {
  10. double av[3] = { 111.1, 222.2, 333.3 };
  11. //函数指针,并且直接赋值了
  12. const double *(*p1)(const double *, int) = f1;
  13. auto p2 = f2;//使用C++11特性
  14. //const double *(*p2)(const double *, int) = f2;
  15. cout << "使用函数指针:\n";
  16. cout << "地址\n";
  17. cout << (*p1)(av, 3) << ": " << *(*p1)(av, 3) << endl;
  18. cout << p2(av, 3) << ": " << *p2(av, 3) << endl;
  19. return 0;
  20. }
  21. const double *f1(const double* ar, int n)
  22. {
  23. return ar;
  24. }
  25. const double *f2(const double ar[], int n)
  26. {
  27. return ar + 1;
  28. }
  29. const double *f3(const double ar[], int n)
  30. {
  31. return ar + 2;
  32. }

运行结果:

 

1.3 函数指针数组 

示例:


  
  1. //arfupt.cpp -- 数组函数指针
  2. #include<iostream>
  3. using namespace std;
  4. // 相同的声明
  5. const double * f1(const double ar[], int n);
  6. const double * f2(const double ar[], int n);
  7. const double * f3(const double ar[], int n);
  8. int main()
  9. {
  10. double av[3] = { 111.1, 222.2, 333.3 };
  11. //函数指针,并且直接赋值了
  12. const double *(*p1)(const double *, int) = f1;
  13. auto p2 = f2;//使用C++11特性
  14. //const double *(*p2)(const double *, int) = f2;
  15. cout << "------------ 1 ---------------" << endl;
  16. cout << "使用函数指针:\n";
  17. cout << "地址\n";
  18. cout << (*p1)(av, 3) << ": " << *(*p1)(av, 3) << endl;
  19. cout << p2(av, 3) << ": " << *p2(av, 3) << endl;
  20. //------------------------
  21. //auto 在list初始化时不管用!
  22. const double *(*pa[3])(const double *, int) = { f1, f2, f3 };
  23. //but auto works for initializing to a single value
  24. //pb a pointer to first element of pa
  25. auto pb = pa;
  26. //C++11等价于const double *(**pb)(const double *,int ) = pa;
  27. cout << "\n\n------------ 2 ---------------" << endl;
  28. cout << " 使用数组指针:\n";
  29. cout << "地址" << endl;
  30. for (int i = 0; i < 3; i++)
  31. cout << pa[i](av, 3) << ": " << *pa[i](av, 3) << endl;
  32. cout << "\n\n ------------ 3 ---------------" << endl;
  33. cout << "使用指向指针的指针:\n";
  34. cout << "地址" << endl;
  35. for (int i = 0; i < 3; i++)
  36. cout << pb[i](av, 3) << ": " << *pb[i](av, 3) << endl;
  37. //指针指向数组指针会如何?
  38. cout << "\n\n------------ 4 ---------------" << endl;
  39. cout << "使用指针指向数组指针" << endl;
  40. cout << "地址" << endl;
  41. auto pc = &pa;
  42. //C++11 等价于 const double *(*(pc)[3])(const double *,int) =&pa;
  43. cout << (*pc)[0](av, 3) << ": " << *(*pc)[0](av, 3) << endl;
  44. //使用比较麻烦的方法声明
  45. const double *(*(*pd)[3])(const double *, int) = &pa;
  46. //store return value in pdb
  47. const double * pdb = (*pd)[1](av, 3);
  48. cout << pdb << ": " << *pdb << endl;
  49. //alternative notation 替代符号
  50. cout << (*(*pd)[2])(av, 3) << ": " << *(*(*pd)[2])(av,3) << endl;
  51. return 0;
  52. }
  53. const double *f1(const double* ar, int n)
  54. {
  55. return ar;
  56. }
  57. const double *f2(const double ar[], int n)
  58. {
  59. return ar + 1;
  60. }
  61. const double *f3(const double ar[], int n)
  62. {
  63. return ar + 2;
  64. }

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/89434824

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。