匿名结构体类型
再声明结构的时候,可以不完全的声明。 以下代码省略了标签,所以只能使用已经创建好的变量,不能再通过结构体创建新的变量
struct {
char name[20];
short int price;
short int version;
}book1, book2;
struct {
char name[20];
short int price;
short int version;
}*book3,books[2];
int main() {
strcpy(book1.name, "lihua");
book1.price = 20;
(*book3).price = 30;
return 0;
}
注意以下代码
struct {
char name[20];
short int price;
short int version;
}book1;
struct {
char name[20];
short int price;
short int version;
}*book3;
int main() {
book3 = &book1;
return 0;
}
这种代码其实是有错的,编译器会将这两个结构体认为是两个不同类型的结构体,所以是非法的。
结构体的自引用
结构体类型中要包含自己这种类型的变量应该怎么办? 先看下面这块代码
struct Node {
int data;
struct Node n;
};
int main() {
printf("%d\n", sizeof(struct Node));
getchar();
return 0;
}
这个struct Node结构体中,包含data和自己,然后看起来循环起来了,没办法判断多大字节,所以是 错误的。 正确的应该是,结构体中存放下一个结构体的指针
struct Node {
int data;
struct Node* next;
};
int main() {
printf("%d\n", sizeof(struct Node));
getchar();
return 0;
}
他的大小是可以确定出来的,在32位环境里面是8个字节。 以下代码是对这个结构体类型进行重命名,
typedef struct Node {
int data;
struct Node* next;
}Node;
int main() {
struct Node n1;
Node n2;
getchar();
return 0;
}
上面先有了 struct Node类型,然后变量成员里面有Node* next是正确的 使用匿名结构体类型
typedef struct {
int data;
Node* next;
}Node;
这种写法是错误的,因为Node是Node* next;之后才创建出来的,会出现逻辑错误。所以重命名的时候,建议不删除标签Node
|