• C++——指针、右左法则、指针和函数的关系、函数指针、函数转移表(函数指针static)


    目录

    一、指针

    1、定义

    2、 分类

    二、右左法则 

    三、函数指针 

    (1)函数名——代表函数的入口地址(2) 函数指针的用法

    (3)函数指针举例

    (4)扩展:函数转移表

    四、思考题

    一、指针

    1、定义

    • 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址
    • 指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
    • 指针变量:指向存放地址的变量(特殊的变量)。
      基类型:* 指针变量名。
    • 接下来看一个例子,输出结果是多少? 
    1. int main()
    2. {
    3. char a[] = "123";
    4. char b[] = "123";
    5. const char c[] = "123";
    6. const char d[] = "123";
    7. const char* p1 = "123";
    8. const char* p2 = "123";
    9. const char* const p3 = "123";
    10. const char* const p4 = "123";
    11. if (a == b)
    12. cout << "a==b" << endl;//error,数组存储字符串,会开辟新的空间,表示的地址不同
    13. if (a == c)
    14. cout << "a==c" << endl;//error
    15. if (c == d)
    16. cout << "c==d" << endl;//error
    17. if (p1 == p2)
    18. cout << "p1==p2" << endl;//true,指向字符串常量区,指向字符串的首地址。
    19. if (p3 == p4)
    20. cout << "p3==p4" << endl;//
    21. if (p1 == p3)
    22. cout << "p1==p3" << endl;//
    23. }
    • 运行结果如下:
    • 因为abcd是数组,数组存储字符串,会开辟新的空间,所以abcd表示的地址各不相同。 
    • p1,p2,p3是指针,指针指向字符串常量区,指向字符串所在的首地址,所以p1p2p3指向的地址是同一个,故相等。

     

    2、 分类

    单指针、双指针、指针数组、数组指针、指针函数、函数指针
    ①单指针:变量、一维数组、二维数组、函数
    ②双指针:变量、指针数组
    ③字符指针

    二、右左法则 

    方法:
    //先看标志符,往右看一个再往左看一个

    举例:
    ①int (*p)[4]——p是整型数指针——数组指针——指向数组的指针//先找标志符,看p,跟星号相结合,p是指针

    ②int *q[4];——q是指针数组——存储指针的数组//q是数组名,后面直接跟[]

    int (*p1[5])——p1是指针数组,括号里没有函数

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

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

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

    三、函数指针 

    (1)函数名——代表函数的入口地址
    (2) 函数指针的用法


     ①指针指向函数,由指针调用函数
     ②函数指针作为另外一个函数的参数
     ③函数指针组作为另外一个函数的返回值

    (3)函数指针举例

             函数指针函数 fn是个函数名,函数里面有int n的一个参数,fn函数的返回值是个指针,
    这个指针指向一类函数 int xx(int,int)。

    1. int (*fn(int n))(int, int)//函数指针函数
    2. {
    3. cout << "fn n=" << n << endl;
    4. return min;//返回值是个指向函数的指针,在此可以返回函数名
    5. }
    6. int main()
    7. {
    8. int (*p)(int, int);//函数指针,p是一个指针,指向一类函数,函数有两个int型参数,返回值为int
    9. p = Sum;
    10. cout << Sum(4, 7) << endl;
    11. cout << p(3, 6) << endl;
    12. test(2, 9, max);//将max传给p,相当于p=max;p->max
    13. cout << "函数指针作为函数返回值:" << endl;
    14. //cout<
    15. p=fn(100);//p=min
    16. cout << p(3, 20) << endl;
    17. }

    (4)扩展:函数转移表

    • 转移表就是一个函数指针数组,声明并初始化一个数组。
    •  确保函数原型出现在这个数组声明之前,在使用转移表这个指针数组时特别要注意下标引用不要越界,否则会引起不可预知的后果。 
    • 函数在被使用时总是由编译器把它转换为函数指针。

    四、思考题

    • 用构造函数求解: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----->return f1(98)+99
    当n=98时
    return pf[!!98](97)+98----->return f1(97)+98
    ......
    当n=0时
    return pf[!!0](-1)+0------>return f0(-1)+0//结果是0

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

    如有错误,敬请指正。

    您的收藏与点赞都是对我最大的鼓励和支持!

  • 相关阅读:
    2020-2023中国高等级自动驾驶产业发展趋势研究-概念界定
    深入理解常见的二十三种设计模式
    setInterval和setTimeout的区别
    阿里DataX极简教程
    链动2+1模式简单,奖励结构丰厚,自主裂变?
    SQL-LIBS 41-50通关过程
    你真的看懂扩散模型(diffusion model)了吗?(从DALL·E 2讲起,GAN、VAE、MAE都有)
    top 重定向输出
    第15章 - 垃圾回收相关算法
    C++类与对象(下)
  • 原文地址:https://blog.csdn.net/x20020402/article/details/127599727