辨认一个复杂声明表达式中变量的类型

何谓复杂声明表达式子中变量的类型?先来看看这段代码:

typedef double* (*a)[10];
typedef int* (*b[10])[10];
typedef int(*(*c)(int,int))(int);
typedef int(*(**d[5])(int))(void(*)(void));

以上a,b,c,d 的类型是什么呢?

当然,实际工程中不太会出现这么复杂的类型,所以这个知识点在实际过程中没有太大的重要性,再加上C++11有了auto关键字,使得我们在定义类型的时候可以不用完全知晓变量的类型。
例如我要定义一个指针指向上述中的d类型变量:

d var1;
auto var2 = &m;

所以说,这个知识点大多数可能会在笔试中遇到,给你一个复杂类型表达式,然后问你它的类型,又或者是进行某些运算后,问其结果。

那么这里我提供几个技巧,可以快速方便的找出变量的类型:

首先先说符号结合优先级:

  1. 最高是()括号,注意这里的括号不是函数表达式中参数列表的括号。
  2. 然后是函数参数列表的括号、数组(这两个是同级)。
  3. 最后是 * 指针(引用&和指针也同级,但这里不谈论引用)。

优先级讲完了,在来讲如何去认类型:

比如: typedef double* (*a)[10];

我们先找到变量的位置,然后根据符号结合优先级依次结合:

  1. 因为有括号,所以最先结合的是 * ,说明 a 是一个指针,指向的是(这个时候用新变量替换*a ) double* aa[10]。
  2. 然后继续结合,这次是跟[10]结合,所以a是一个指针指向一个数组,数组大小为10,元素类型为(继续替换) double* aaa;
  3. 很显然了aaa类型为double*,所以综上:a是一个指针指向一个大小为10,元素类型为double*的数组。

继续举例子:typedef int* (*b[10])[10];

  1. 首先结合是[10],说明b是一个数组,大小为10,元素类型为(用新变量替换)int* (*bb)[10]。
  2. 继续结合*,说明数组元素类型为指针,指向(替换)int* bbb[10]。
  3. 很显然了bbb的类型为数组,数组元素为int*。
  4. 所以综上:b是一个数组,大小为10,元素类型为指向大小为10,元素类型为int* 的数组的指针。

继续举例子:typedef int(*(*c)(int,int))(int);

  1. 首先结合是*,说明c是一个指针,指向的是(替换)int(*cc(int,int))(int)。
  2. 继续结合函数参数列表(int,int)。说明cc是一个函数,函数参数列表为(int,int)返回值为(替换)int(*ccc)(int)。
  3. 很显然了ccc的类型为函数指针,指向参数列表为(int),返回值为int的函数。
  4. 所以综上:c是一个指针,指向一个参数列表为(int,int)返回值为函数指针,这个函数指针指向参数列表为(int),返回值为int的函数。

最后一个例子:typedef int(*(**d[5])(int))(void(*)(void));

  1. 首先结合的是*,说明d是一个指针,指向(替换)int(*(*dd[5])(int))(void(*)(void))。
  2. 然后结合的是[5],说明dd是一个数组,数组元素是(替换)int(*(*ddd)(int))(void(*)(void))。
  3. 然后结合的是*,说明ddd是一个指针,指向的是(替换) int(*dddd(int))(void(*)(void))。
  4. 然后结合的是(int),说明dddd是一个函数,函数列表为(int),返回值为(替换) int(*ddddd)(void(*)(void))。
  5. 然后结合的是*,说明ddddd是一个指针,指向(替换)int dddddd(void(*)(void))。
  6. 很显然了dddddd是一个函数,函数参数列表为(void(*)(void)),返回值是int。这里的参数是一个函数指针。函数参数、返回值都是void。
  7. 综上所述:d是一个指针,指向一个数组,数组元素是指针,元素指向一个函数,函数的参数为int,返回值为一个函数指针,指向一个返回值为int,参数为一个函数指针,指向返回值和参数都为空的函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值