有人可以解释当我们使用typedef“类型时发生了什么 施放“语法?
typedef int (*funcptr)(double); (Wiki) funcptr x = (funcptr) NULL;
OR
pg470,K.N.King - 现代方法
typedef int *Fcn(void); typedef Fcn *Fcn_ptr; typedef Fcn_ptr Fcn_ptr_array[10]; Fcn_ptr_array x;
不是吗:
typedef oldtype newtype; typedef int Bool;
那怎么做:typedef int * Fcn(void)有意义吗? 通常:int * Fcn(void),将是一个没有的函数“Fcn” 参数并返回指向int的指针..如果我坚持一个typedef是什么 发生??
funcptr是一个指针变量..它不是一个类型..?他怎么能投 NULL到(funcptr)????这个语法在某处清楚地解释了 - K.N.King在没有提到这种特殊语法的情况下抨击它 任何地方..
答案 0 :(得分:2)
来自“C语言参考手册”,第7章:
使用存储类说明符typedef的声明不定义存储。 typedef具有以下语法:typedef-name:identifier。出现在typedef声明中的标识符将成为该类型的同义词,而不是成为具有给定类型的对象。
所以typedef int(* funcptr)(double)表示funcptr是一个函数指针,该函数有一个参数double,返回类型是int。
答案 1 :(得分:2)
在C中定义typedef
的语法与变量的定义相同,但前缀为关键字typedef
。
所以,例如:
int a[10];
将a
声明为array-of-10-ints的变量,然后执行以下操作:
typedef int b[10];
将b
定义为10-int的类型数组。
功能类型也是如此:
int f(double);
将f
声明为接收double
并返回int
的函数。然后:
typedef int g(double);
将g
定义为此类函数的类型。
当然,您无法声明 function 类型的变量,因此以下内容不正确:
g ag; //Error
但是你可以用它来声明类型指针的变量:
g *pg; //OK
这就是为什么通常首选使typedef成为指向函数的指针:
typedef int (*k)(double);
这里k
是一个指向函数的指针,它接收一个double并返回一个int。
通过这种方式,您可以声明与avobe等效的变量pg
:
k pg;
答案 2 :(得分:0)
typedef int (*funcptr)(double);
将funcptr
定义为函数指针,其中指向的函数采用类型double
的单个参数,并返回{{ 1}}。
否则int
必须声明为:x
。每次你想要一个这种类型的变量时,它就不必每次都输入这个。更不用说它使您的代码更容易更改。
您可以将int (*x)(double)
分配给任何类型的指针,以指示您的指针未指向任何有效位置(NULL
)。 funcptr x = (funcptr) NULL;
将被定义为无效内存位置的NULL
,您无需将其强制转换为void*
。
你的第二个例子只是将x
分成几个步骤,结果是一个函数指针数组的typedef
。