hello大家好,我是阿乐。今天的内容是c语言进阶的自定义类型:结构体。现在就让为大家详细介绍讲解一下这部分内容。希望读者看到后能有所收获,有什么问题也可以在评论区留言或者私信我。
目录
结构体
1.1结构的基础知识
结构是一些值的集合,这些值成为成员变量。每个结构的成员可以是不同类型的变量。
1.2结构声明
struct tag
{
member-list;
}variable-list;
例如描述一个学生的基本信息:
struct Student
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
};//分号不能丢
1.3特殊的声明
在声明结构的时候,可以不完全的声明。
比如:
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
上面的两个结构体类型省略掉了结构体标签(tag)。那么问题就来了,在以上代码的基础上,定义 p = &x;这合法吗?
答案是否定的。当然不合法,因为编译器会把上面的两个声明当成完全不同的两个类型。所以是非法的。
1.4结构体的自引用
下面先引用一个例子,大家看看有没有问题。
struct Stu
{
char name[20];
int age;
char sex[5];
struct Stu zhangsan;
};
大家能否找出其中的问题呢?相信不难看出,这里的自引用出现了问题。如果可以的话那么sizeof (struct Stu) 是多大呢?
正确的自引用方式应该是下面所示:
struct Stu
{
char name[20];
int age;
char sex[5];
struct Stu* zhangsan;
};
注意:
typedef struct Stu
{
char name[20];
int age;
char sex[5];
struct Stu* zhangsan;
}Stu;
以上需要注意的是typedef重命名的正确用法。
1.5结构体变量的定义和初始化
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
以上就是今天的全部内容啦,大家如果还有什么疑惑的话欢迎留言和私信哦。当然如果有更好的建议我也会虚心学习的!