0x00 前言

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

0x01 规则解释

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

0x02 实际应用

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

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

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

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

简单例子三: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型指针的指针。

C++中复杂声明和定义的辨析的更多相关文章

  1. PHP中变量声明和定义的区别

    先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...

  2. C/C++中的声明与定义

    含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...

  3. C++中的声明与定义

    转自:http://www.cnblogs.com/kingcat/archive/2011/12/30/2307426.html C++是一种复杂的计算机语言,很多在现代高级语言中已经不需要程序员操 ...

  4. C语言中的声明与定义的差别

    1.对于以下的声明语句 int a;        假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没 ...

  5. 在源文件(.c)和头文件(.h)中声明和定义的区别——C语言

    最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 情形一:在源文件(.c)中 相信大部分读者对声明和定义的理解是 ...

  6. 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏

    以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...

  7. switch语句下的变量声明和定义

    switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...

  8. 声明、定义 in C++

    序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述:          1.需要建立存储空间的 ...

  9. 【转】变量的声明和定义,从C到编译原理到C++,再到Java

    基础学了太久,时间一长有些东西就可能记得不太清楚,俗话说得好,"好记性不如烂笔头",所以把基础中的基础-变量的声明和定义,从C到编译原理到C++,再到Java用烂笔头记录下来 最早 ...

随机推荐

  1. 如何在交互式环境中执行Python程序

    相信接触过Python的小伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Pyth ...

  2. kebernets常用命令-整理

    1.deployment相关命令 查看所有deployment: kubectl get deployments 查看指定命名空间的所有deployment: kubectl get deployme ...

  3. Java编程技术之浅析JVM内存

    JVM JVM->Java Virtual Machine:Java虚拟机,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 基本认知: ...

  4. [windows][技巧]百度网盘提示您的电脑已安装百度网盘,是否覆盖,解决方法

    目录 故障描述 解决方法 故障描述 解决方法 win+r,输入regedit,进入注册表 依次打开HKEY_CURRENT_USER->Software->Baidu->BaiDuY ...

  5. 前端技术 - SeaJS学习

    SeaJS 是一个模块加载器,模块加载器需要实现两个基本功能: 实现模块定义规范,这是模块系统的基础. 模块系统的启动与运行. define参数 在 CMD 规范中,一个模块就是一个文件.代码的书写格 ...

  6. [FireDAC][Phys][MSSQL]-310._数据库安装工具_问题需要解决_连载_3

    //先来看看我们碰到的问题,再来求解答SQL脚本执行失败,[FireDAC][Phys][MSSQL]-310. Cannot execute command returning result set ...

  7. [每日一题2020.06.11]Codeforces Round #644 (Div. 3) H

    A-E见 : 这里 题目 我觉得很有必要把H拿出来单独发( 其实是今天懒得写题了 ) problem H 一个从 1 到 $ 2^m - 1$ 的长度为m的连续二进制序列, 删去指定的n个数, 问剩余 ...

  8. 手写简易版Promise

    实现一个简易版 Promise 在完成符合 Promise/A+ 规范的代码之前,我们可以先来实现一个简易版 Promise,因为在面试中,如果你能实现出一个简易版的 Promise 基本可以过关了. ...

  9. Cannot instantiate the type Map

    今天在使用Map中犯了个低级错误,记录一下: 打算使用map为一个视频List观看记录的统计标识,key为vid,value默认为false,当该key已经统计,标识value为true,初始实例化M ...

  10. 手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...