文章目录
C语言自定义类型
一:结构体
1.为什么要使用结构体?
C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学生,描述⼀本书,这时单⼀的内置类型是不行的。描述⼀个学生需要名字、年龄、学号、身高、体重等;描述⼀本书需要作者、出版社、定价等。C语言为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以自己创造适合的类型。
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚⾄是其他结构体。
2.结构体的声明:
(1)一般声明:
描述一个学生:
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //分号不能丢
(2)特殊声明:
在声明结构的时候,可以不完全的声明,这种结构体被称为匿名结构体。
比如:
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], * p;
上面的两个结构在声明的时候省略掉了结构体标签。
那么问题来了?
在上面代码的基础上,下面的代码合法吗?
p = &x;
从上面结果中我们能够看出:会出现警告:“ = ”:从 “ * ” 到 “ * ” 的类型不兼容
警告:
编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。
匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。
3.结构体变量的定义和初始化:
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//代码2:初始化
struct Point p3 = {
10, 20 };
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s1 = {
"zhangsan", 20 };//初始化
struct Stu s2 = {
.age = 20, .name = "lisi" };//指定顺序初始化
//代码3
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {
10, {
4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = {
20, {
5, 6}, NULL };//结构体嵌套初始化
4.结构成员访问操作符:
(1)结构体成员的直接访问
结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如下所示:
#include <stdio.h>
struct Point
{
int x;
int y;
}p = {
1,2 };
int main()
{
printf("x: %d y: %d\n", p.x, p.y);
return 0;
}
使用方式:结构体变量 . 成员名
(2)结构体成员的间接访问
有时候我们得到的不是⼀个结构体变量,而是得到了⼀个指向结构体的指针。如下所示:
#include <stdio.h>
struct Point
{
int x;
int y;
};
int main()
{
struct Point p