(float (*)())是类型转换符,怎么理解

来源:百度知道 编辑:UC知道 时间:2024/07/02 14:09:19
在一本书上看到:

“float (*h)();表示h是一个指向返回值为浮点类型的函数的指针,因此,

(float (*)())表示一个“指向返回值为浮点类型的函数的指针”的类型转换符。”

为什么它是类型转换符??怎么理解?
第一句我懂,
就是第二句,少了个h,加上括号它就成了类型转换符。是为什么呢?

对于复杂定义的分析 ,先从中间开始 ,然后以 先右后左 的原则向外扩展 ,以你这个为例 。首先看到 h 是 变量名 ,向右看 ,以右括号结束 ,再向左看 ,看到 * ,说明是个指针 ,再向右看 ,发现一对括号 ,表明这是一个空参数列表的函数的指针 ,再向左看 ,这个函数返回 float 。故这是一个 指针 ,指向一个返回 float 的无参函数 。
也可以用 typedef 逐层定义 ,从外层开始:
typedef float ft() ;//定义 ft 为返回 float 的空参数列表的函数 类型
typedef ft * ht ; //定义 ht 为 ft 的指针
ht h ;//完成定义 ,作用与 float (*h)(); 相同

如果是要把某个类型强制转换为 ht 类型 ,使用 (ht) 即可 ,也可以使用它的原型 (float (*)()) ,*加括号的原因是优先级问题 。

关于楼主补充:
不是说“少了个h,加上括号它就成了类型转换符”,注意这里 float (*h)(); 是变量定义 ,定义了 h 这个变量 , float (*)() 是变量 h 的类型 ,而C语言的类型转换格式是 (TYPE)var ,所以说“ (float (*)())表示一个‘指向返回值为浮点类型的函数的指针’的类型转换符” , 复杂的类型确实不易阅读 ,楼主如果不习惯 ,就用 typedef 逐层定义了用即可 。

第一句可以转换为
float *h;

第二句转换为
(float *)

括号多了反而不好看

比如可以把一个long的指针强制转为float型的:
long *a;
float *b=(float *)a;

你试试这句
float a=10;
printf("%d",*(int *)&a);

用的环境不一样

int a;就是声明语句,a第一次出现
(int)a,就是把a强制转换为int型的,a第二次出现,而且int加了括号