1 c
typedef struct tnode { ... } Treenode;
Run Code Online (Sandbox Code Playgroud)
既然typedef不能为我们创建一个新的类型,那么这部分是“struct tnode”的声明吗?那么在上面,它是否创建了一个 typedef“Treenode”并声明了“struct tnode”?
return (Treeptr) malloc(sizeof(Treenode));
Run Code Online (Sandbox Code Playgroud)
在这里,由于 Treenode 是整个“struct tnode”声明的同义词,是否有必要将整个声明传递给 sizeof 或者可以这样做: sizeof(struct tnode) 在通过 struct tnode { ... }; 在别处声明 tnode 之后;
typedef struct tnode *Treeptr;
Run Code Online (Sandbox Code Playgroud)
typedef 为:typedef old-existing-type newtype;所以在这里.. struct tnode * 是旧类型,它必须已经存在(必须在其他地方声明),而 Treeptr 是它的同义词..但为什么我们不能把这个东西隔开??像这样: typedef struct tnode * Treeptr;
typedef int (*PFI)(char *, char *);
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?旧类型是 int 并且 (*PFI)(char , char ) 是 int 的同义词?? 如果 int (*PFI)(char *, char *) 是旧类型,那么新类型是什么??他说“实际上 typedef 就像#define,只是因为它是由编译器解释的,它可以处理超出预处理器能力范围的文本替换”是什么意思?在提到的例子中..为什么预处理器不能做任何正在做的事情?
那么在上面,它是否创建了一个 typedef“Treenode”并声明了“struct tnode”?
是的,同一句话中既有声明又有 typedef。
但为什么我们不能把东西隔开??像这样: typedef struct tnode * Treeptr
如果你在谈论*- 你可以。无论如何,它是一个单独的令牌。
typedef int (*PFI)(char *, char *);
Run Code Online (Sandbox Code Playgroud)
这是一个函数类型定义;
typedef int (*PFI)(char *, char *);
^ define a type called
^PFI as:
^ pointer
^to function
^that receives two char pointers as arguments
^ and returns an int
Run Code Online (Sandbox Code Playgroud)
现在您可以使用 PFI 而不是int (*)(char *, char *)(当用作参数/变量时)
编辑:
使用函数指针的代码示例:
#include <stdio.h>
int add(int a, int b) { return a + b; }
typedef int (*pfi)(int,int);
int main()
{
pfi my_func = add;
int res;
res = (*my_func)(1,2);
printf( "add(1,2)=%d", res);
return res;
}
Run Code Online (Sandbox Code Playgroud)