• C++指针基本概念及函数指针详解


    目录

    1、什么是指针?

    2、指针的分类

    3、 指针判定的右左法则

    4、函数指针

    1、指针指向函数,由指针调用函数

    2、函数指针作为另外一个函数的参数

    3、函数指针作为另外一个函数的返回值

    扩展——函数转移表!!

     练习题:

    1、什么是指针?

    指针就是一个地址。

    指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

    指针变量是存放一个内存地址的变量,不同于其他类型变量,它是专门用来存放内存地址的,也称为地址变量。定义指针变量的一般形式为:类型说明符*指针变量名。

    2、指针的分类

    单指针、双指针、指针数组、数组指针、指针函数、函数指针、字符指针

    单指针:可以与变量、一维数组、二维数组、函数进行联系

    双指针:可以与变量、指针数组进行联系

    字符指针如下代码所示:

    a、b、c、d代表的是数组首元素的首地址,其所开辟的空间地址不相同,a、b、c、d代表不同的空间首地址,所以a!=b,a!=c

    p1、p2、p3、p4指向字符串常量,存储的是该字符串的首地址,因为其所指向的字符串相同,p1、p2、p3、p4指向的字符串首地址相同,所以p1==p2 ,p3==p4 ,p1==p3

    1. //字符指针
    2. void main()
    3. {
    4. char a[] = "123";
    5. char b[] = "123";
    6. const char c[] = "123";
    7. const char d[] = "123";
    8. //a b c d代表的是数组的首地址
    9. const char *p1 = "123";//所指向内容是const
    10. const char *p2 = "123";
    11. const char *const p3 = "123";
    12. const char *const p4 = "123";
    13. //p1 p2 p3 p4存放字符串首地址
    14. if (a == b)
    15. cout << "a==b" << endl;
    16. if (a == c)
    17. cout << "a==c" << endl;
    18. if (p1 == p2)
    19. cout << "p1==p2" << endl;
    20. if (p3 == p4)
    21. cout << "p3==p4" << endl;
    22. if (p1 == p3)
    23. cout << "p1==p3" << endl;
    24. }
    25. //输出结果为:p1==p2 p3==p4 p1==p3

    3、 指针判定的右左法则

    首先从最里面的圆括号开始阅读,然后向右看,再往左看。每当遇到圆括号时,就应该调转阅读方向。一旦解析完圆括号里面所有东西,就跳出圆括号。重复整个过程直到整个声明解析完成。其实左右法则就是以标示符为中心点,自右向左旋转解读指针的声明含义。

    int (*p)[4]——整型数组指针——指向数组的指针

    int *q[4]——整型指针数组——存储指针的数组

    int (*p1[5])——整型指针数组

    int*(*p2[3])(int)——整型指针函数指针数组

    int *p3(int n)——整型指针函数——返回值为指针的函数

    int (*p4)(int,int)——整型函数指针——指向函数的指针

    4、函数指针

    函数名:代表函数的入口地址

    1、指针指向函数,由指针调用函数

    1. int Sum(int a, int b)
    2. {
    3. return a + b;
    4. }
    5. void main()
    6. {
    7. int (*p)(int, int);//函数指针,p是一个指针,指向一个函数,函数有两个int型参数,返回值为int
    8. p = Sum;
    9. //cout << Sum(4, 7) << endl;
    10. cout << p(4, 7) << endl;//等价
    11. }

    2、函数指针作为另外一个函数的参数

    1. int max(int a, int b)
    2. {
    3. return a > b ? a : b;
    4. }
    5. void test(int x, int y, int(*p)(int, int))
    6. {
    7. cout << p(x, y) << endl;
    8. }
    9. void main()
    10. {
    11. test(2, 9, max);//将max传给p,相当于p=max
    12. }

    3、函数指针作为另外一个函数的返回值

    1. /*
    2. * 函数指针函数 fn是个函数名,函数里面有int n的一个参数,fn函数的返回值是个指针,这个指针指向一类函数 int xx(int,int)
    3. */
    4. int (*fn(int n))(int, int)//函数指针函数
    5. {
    6. cout << "fn n=" << n << endl;
    7. return min;//返回值是个指向函数的指针,在此可以返回函数名
    8. }
    9. void main()
    10. {
    11. int (*p)(int, int);//函数指针,p是一个指针,指向一个函数,函数有两个int型参数,返回值为int
    12. cout << "函数指针作为函数返回值" << endl;
    13. cout << fn(100)(3, 20) << endl;//先调用fn函数,将100传递给参数n,fn函数返回min,再调用min(3,20)
    14. p = fn(100);//p->min
    15. cout << p(3, 20) << endl;
    16. }

    扩展——函数转移表!!

    1. int Sum(int a, int b)
    2. {
    3. return a + b;
    4. }
    5. int max(int a, int b)
    6. {
    7. return a > b ? a : b;
    8. }
    9. int min(int a, int b)
    10. {
    11. return a < b ? a : b;
    12. }
    13. int Sub(int a, int b)
    14. {
    15. return a - b;
    16. }
    17. int Mul(int a, int b)
    18. {
    19. return a * b;
    20. }
    21. void main()
    22. {
    23. int (*p[])(int, int) = { Sum,max,min,Sub,Mul };//函数指针数组
    24. int x = 10, y = 20;
    25. int n = sizeof(p) / sizeof(p[0]);
    26. for (int i = 0; i < n; i++)
    27. {
    28. cout << p[i](x, y) << endl;
    29. }
    30. }

     练习题:

    1+2+3+4+...+100不能用if,不能用循环,不能用公式,不能直接输出结果

    代码思路:

    n=100

    return pf[!!100](99)+100->return pf[1](99)+100->f1(99)+100;

    n=99

    return pf[!!99](98)+99->f1(98)+99;

    n=98

    return pf[!!98](97)+98->f1(97)+98; 

    .......

    return pf[!!0](-1)+0->pf[0](-1)+0->f0(-1)+0->0;

    1. int f0(int n)
    2. {
    3. return 0;
    4. }
    5. int f1(int n)
    6. {
    7. static int(*pf[2])(int) = { f0,f1 };//pf[0]=fo fp[1]=f1
    8. return pf[!!n](n - 1) + n;
    9. }
    10. void main()
    11. {
    12. cout << f1(100) << endl;
    13. }

     n个1~10的数据,例如1 3 2 5 4 7 4 6 3 6 3 ,计算1~10出现的次数

    代码思路:

    运用桶排序

    1. void main()
    2. {
    3. int num[] = { 1,2,3,4,5,6,7,8,9,1,4,3,2,5,10,2,9 };
    4. int n = sizeof(num) / sizeof(num[0]);
    5. int count[11] = { 0 };
    6. int i;
    7. for (i = 0; i < n; i++)
    8. {
    9. count[num[i]]++;
    10. }
    11. for (i = 1; i <= 10; i++)
    12. cout << i << ":" << count[i] << endl;
    13. }
  • 相关阅读:
    【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 机器人搬砖(100分) - 三语言AC题解(Python/Java/Cpp)
    2022暑假xcpc训练数据结构专题-线段树合并
    五分钟搭建博客系统 OK?
    JAVA计算机毕业设计校园爱心志愿系统(附源码、数据库)
    MySQL的EXPLAIN执行计划的属性解释
    React源码分析8-状态更新的优先级机制
    一步一步迁移ASP.NET Core 6.0-Part2
    mac 安装 php xdebug
    CentOS 安装HTTP代理服务器 Squid
    关于解决2345流氓软件的问题
  • 原文地址:https://blog.csdn.net/weixin_59179454/article/details/127738715