有任何不懂的问题可以评论区留言,能力范围内都会一一回答
我们先直接上代码看看结构体的另一种用法
1.匿名结构体
define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//第一个struct
struct
{
char c;
int i;
double d;
}s1;
//第二个struct
struct
{
char c;
int i;
double d;
}*ps;
int main(void)
{
ps = &s1;
return 0;
}
我们发现上面两个struct类型都是没有名字的,也称为匿名结构体,创建这种匿名结构体只能如上图所示声明。
这种匿名结构体一般你只打算把这个结构体用一次的时候可以这么用
那我们再来看第二个,ps=&s1这个,是否是将匿名结构体s1的地址给到ps呢?
答案是否定的,这样的步骤是非法的
编译器会把两个匿名结构体类型当作两个不同的结构体去处理
2.结构体的自引用
结构体的自引用和函数递归是类型的,我们先来看一串代码
struct Node
{
int date;
struct Node next;
};
我们这样写代码可不可以呢?
这样写其实有一个问题就是每一个Node的结构体的大小是无穷无尽的,因为这样是无限嵌套的
那么我们怎么让结构体的大小确定下来呢?
这个时候我们就可以用指针了
因为指针的大小和它所指向的值是无关的,并且指针大小是确定的
这样结构体Node的大小就是一个确定的值
我们还可以通过指针去找到下一个Node结构体
struct Node
{
int date;
struct Node* next;
};
这样写就好啦!
3.结构体重命名
我们来看这串代码
typedef struct Node
{
int date;
struct Node* next;
}Node;
我们把 struct Node
{
int date;
struct Node* next;
};
命名成Node
这样当我们使用Struct Node时候就可以直接用Node去代替了
那如果这样呢
typedef struct Node
{
int date;
Node* next;
}Node;
那么这个地方可以这样写吗?
显然是不行的,因为
typedef struct Node
{
int date;
struct Node* next;
}Node;
这串代码跑完我们才重命名成功
你都没有跑完,都没有重命名成功,就去使用重命名后的,编译器自然无法识别了
(Node* next;编译器无法识别)
先后顺序要分清
那如果这样写呢?
typedef struct
{
int date;
struct Node* next;
}Node;
这样同样不行,对一个匿名结构体重命名,原理和上面一样,你都没有跑完,都没有重命名成功,就去使用重命名后的,编译器自然无法识别了(struct Node* next;编译器无法识别)