• C++中复杂声明和定义的辨析


    0x00 前言

      c++中的复杂声明往往令人无法下手,经常使人搞错这到底声明的是一个指针还是指针函数。但其实c++对于复杂声明是遵循一定的规则的,叫做变量名—>---右规则。

    0x01 规则解释

    对于复杂定义最好的处理方式是从中间开始向外扩展。“从中间开始的”的意思是从变量名开始。“向外扩展”的意思是先注意到右边最近的项,遇到括号则往左边读,然后在前往下一层的右边,遇到括号则向左边读,以此右左右直到全部读完为止。类似于剥洋葱,从里到外层层剥离

    0x02 实际应用

    简单例一:Void *funptr)();//指针

    读法:funptr是一个指针(PS:由于funptr开始向右读就碰到了括号,所以返回左边,读到了指针符号*),这个指针指向一个午无参的返回值为空的函数(PS:既然前面说到了funptr是一个指针,下一步就该说明他的用途了,指针的用途当然是指向的作用)。

    简单例二:Void* funptr();//返回指针的函数

    读法:funptr是一个无参函数(PSfunptr右边有括号,故先读出来,右边带括号的意思就是函数),该函数返回空型指针。

    简单例子三:int (*p)(char)//指针

    读法:p是一个指针,这个指针指向一个无参的返回值位int类型的函数。

    0x02 更为复杂的情况

    复杂定义常常带有const,[]等关键字或者符号。特别是const更容易引起我们的误读。

    例子一:char **p;

    读法:p是一个指针,该指针指向一个指针,这个被指向的指针是char类型的。

    这样读看起来很拗口,但是可以帮你层层剥离定义之间的关系。当然也可以这样读:p是一个指向char类型的指针的指针,虽然这样读通顺了很多,但是不熟悉的还是不建议。

    例子二:const char **p2;

    读法:p2是一个指针,这个指针指向另一个指针,被指向的指针是const char型(PS:const char 这种顺序放一起连读即可,不然这个太拗口了)

    也可读作:p2是一个指向const char类型的指针的指针。

    例子三:char * const * p3;

    读法:p3是一个指针,这个指针是const指针(理解为常量指针,值不变),被指向的const指针为char类型。也可读作:p3是指向char型指针的const指针。

    上诉几个例子还不算难,下面来看几个难度很大的。

    难例一:
    char ** (*p)(float, float);  

    读法:p是一个指针,它指向了带有两个float参数的函数的指针,被P指向的指针是指向函数返回值char型指针的。简单说来就是p是指向了一个返回值为char型指针的指针。

  • 相关阅读:
    QQ邮箱自动删除邮件脚本
    5ppm高精度自动同步标准化考场时钟系统
    GPS时钟之户外防水防雷细节
    C/C++ Compile Run插件,使用某些头文件出现重定义的错误,解决方法为修改MinGW的路径
    7zip 通过指令压缩 仅存储压缩 分压缩卷 / 对文件夹里的文件进行解压,解压到对应文件名所在的文件夹上
    循环队列FIFO
    cglib和jdk代理的字节码生成配置
    SpringXML的beans标签后的一串网址相关的属性有什么用
    service和server这两个单词的区别
    没有代码提示的地方,前后引用记得用复制不要手打
  • 原文地址:https://www.cnblogs.com/2f28/p/9794946.html
Copyright © 2020-2023  润新知