69,371
社区成员
发帖
与我相关
我的任务
分享
struct StructName
是一个完整的类型名。就像:int
一样,区别是 struct 是自定义类型,而 int 是内置类型。所以声明的时候写法也是类似的:int n;
struct StructName dummy;
但是 C 语言同样提供一个 typedef 关键字,可以给已有类型(包括内置和自定义类型)定义别名:typedef int INT;
typedef struct StructName STRUCTNAME;
注意看上面的结构,其实和声明变量一样的,只是在前面加一个 typedef。
如果没有 typedef,INT 就是一个 int 类型变量,STRUCTNAME 是 struct StructName 类型变量。
加了 typedef 则“变量名”就变身“类型名”,而“类型名”代表的类型正是加 typedef 之前“变量名”对应的类型。
根据上述逻辑,也可以定义对应的指针类型:typedef int *PINT;
typedef struct StructName *PSTRUCTNAME;
定义了这些别名之后,你就可以这样用:INT n;
STRUCTNAME dummy;
PINT pn;
PSTRUCTNAME pdummy;
等价于:int n;
struct StructName dummy;
int *pn;
struct StructName *pdummy;
C++ 语言:
C++ 中引入了类,关键字为 class,它是 struct 的增强版本。声明一个类:class ClassName {
private:
int n;
public:
void setValue(int n);
int getValue();
};
当声明这个类的对象时,这样书写:ClassName className;
而不需要像 struct 一样写成这样:class ClassName className;
但是,在 C++ 中,把 class 换成 struct 一样可以编译:struct StructName {
private:
int n;
public:
void setValue(int n);
int getValue();
};
声明这个“struct”的对象时,可以这样书写:StructName structName;
而不需要像在 C 语言中一样写成这样:struct StructName structName;
但是由于 C++ 兼容绝大多数 C 语法特性,因此上面这种写法也是正确的。typedef struct LNode * list;
这条语句就是将struct LNode *可以用list代替。当然struct LNode也是可以定义指针的。
但是也是有区别的。
比如如下:
list a, b;
struct LNode *a, b;
第一条语句定义了2个指针变量,第二条语句定义了一个指针变量,一个结构体普通变量;
这就是为什么用宏定义和typedef的一个区别吧