目录
结构体
结构体是什么?
结构是一些值的集合 , 这些值称为成员变量。结构的每个成员可以是不同类型的变量。
数组也是一些值的集合,但这些值的类型是相同的。
结构体的定义
struct 结构体名
{
成员表列;
}变量表列;
定义结构体的例子:
struct Stu
{
int age;
char name[20];
}s1,s2;
定义了一种结构体叫 Stu ,它有两个成员:age 和 name ,类型分别是 int 和 char [20],随后定义了两个结构体变量 s1 和 s2。
如果结构体定义在 main 函数之前,那么 s1 和 s2 就是全局变量。结构体也可以在 main 函数内部定义。
定义结构体变量可以在定义结构体时就定义,如 s1 和 s2,也可以在 mian 函数内定义:
struct Stu
{
int age;
char name[20];
}s1,s2;
int main()
{
struct Stu s3, s4;
return 0;
}
typedef
如果每次定义结构体变量的时候不想写 struct ,可以在定义结构体变量时写上一个 typedef,如:
typedef struct student
{...}Stu;
下次定义结构体变量时,就只需要写 Stu s1;而不需要写 struct student s1;
typedef 也可以在定义结构体之后再使用:
struct student
{...};
typedef struct student stu;
分析以下代码:
typedef struct Node
{
int data;
Node* next;
}Node;
代码的原意是将结构体 struct Node 命名为 Node ,在定义结构体时就直接用 Node 来定义 next 指针,但这种做法是不合法的。
匿名结构体
匿名结构体就是在定义结构体时,不指定结构体的名字:
struct
{
int age;
char name[20];
}s1,s2;
这种结构体只有在定义结构体后就定义结构体变量,而不能在其他地方定义结构体变量。
分析以下代码:
struct
{
int age;
char name[20];
}s1;
struct
{
int age;
char name[20];
}*p;
int main()
{
p = &s1;
return 0;
}
s1 和 p 的结构是一样的,但 p = &s1 ;是不合法的。
结构体的自引用
在结构中包含一个类型为该结构本身的成员是否可以呢?
struct Node
{
int data;
struct Node next;
};
这是不行的,因为这种结构体类型的大小是无穷大的,但是我们可以把 struct Node next 改为
struct Node * next;这样这种结构体类型的大小就是 8 或 12 了,并且这种结构体就叫作链表。
链表
struct Node
{
int data;
struct Node *next;
};
结构体变量的初始化
示例:
struct Stu
{
int age;
char name[20];
}s1 = { 21,"zhangsan" };
struct Stu s2 = { 12,"wangwu" };
int main()
{
struct Stu s3 = { 18,"lisi" };
return 0;
}
即按照定义结构体时成员变量的顺序,将要初始化的内容用大括号括起来,并且用逗号隔开。
如果结构体内定义有结构体,则初始化这种结构体时对结构体内的成员结构体初始化要加大括号:
struct A
{
int a;
char arr1[20];
};
struct B
{
int b;
struct A a1;
char arr2[20];
};
struct B b1 = { 12,{30,"hehe"},"haha" };

&spm=1001.2101.3001.5002&articleId=145288165&d=1&t=3&u=96c4697144e74994915ba883248ce267)
1744

被折叠的 条评论
为什么被折叠?



