目录
一、结构体
1.定义
结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。结构体和数组类似,也是一组数据的集合,struct 语句定义了一个包含多个成员的新的数据类型,类别类似于int,char数据类型,struct 语句的格式如下:
struct tag
{
member-list
member-list
member-list ...
} variable-list ;
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i; 或者 float f的 i 和f ,或者其他有效的变量定义。
variable-list 结构别名,定义在结构的末尾,最后一个分号之前,这里的别名就相当于结构体类型名,之后就可以使用它定义结构体变量了。
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。
以下为实例:
struct
{
int a; char b;
double c;
} s1;
//这种匿名结构体(只定义结构体成员和结构体变量),结构体变量只能是s1,不能更改
struct SIMPLE
{
int a; char b;
double c;
};
//结构体的标签被命名为SIMPLE,没有声明变量
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
struct SIMPLE
{
int a; char b;
double c;
}s1;
//结构体的标签被命名为SIMPLE,声明变量为s1
2.在结构体前加上typedef 和不加的区别
首先,typedef是C语言的一个关键字,它的作用是为类型名定义别名。在形式上通常写作:typedef 类型名 别名;
struct SIMPLE
{
int a; char b;
double c;
}s1;
//struct前不加typedef,定义结构体变量需要加上struct
struct SIMPLE s1 ;
//加typedef创建新类型
typedef struct
{
int a; char b;
double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
3.结构体的类型
3.1结构体指针
结构体指针的定义:
struct 结构体名 *指针变量名;
struct stu//定义一个结构体
{
char* name;
//char name[10];
int age;
int num;
};//char name[10] 可以用char* name代替,数组名name是数组的首地址,将数组name的首地址强制转化为指针
int main(void)
{
struct stu s1,*s;//定义一个结构体变量和一个结构体指针
s = &s1;//让指针s指向结构体变量s1,就是将s1的首地址赋予指针s
s->name = "Bob";//赋值
//strcpy(s->name,"Bob");//如果把name定义为一个数组则使用该语句赋值
s->age = 22;
s->num = 6;printf("name=%s\n",s->name);//输出内容
printf("age=%d\n", s->age);
printf("num=%d\n", s->num);return 0;
}
3.2结构体数组
结构体数组,是指数组中的每个元素都是一个结构体,C语言结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生(学生共同属性:姓名 学号 成绩)、一个车间的职工等。
//结构体数组在定义的同时也可以初始化
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 }class[5] = { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} };//或者这样表示
typedef struct { char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 }stu;//给结构体初始化,该结构体
stu class[5]= { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} };
3.3指针结构体
指针结构体是指一个结构体中包含一个指向另一个结构体的指针。它可以用来表示复杂的数据结构,如链表、树等。
下面是一个简单的例子,展示了如何定义和使用指针结构体:
```c
#include <stdio.h>
#include <stdlib.h>// 定义一个结构体
struct student {
char name[20];
int age;
struct student *next; // 指向下一个结构体的指针
};int main() {
// 创建三个结构体
struct student *head, *p, *q;
head = NULL;
p = (struct student*)malloc(sizeof(struct student));
q = (struct student*)malloc(sizeof(struct student));// 初始化结构体
strcpy(p->name, "Tom");
p->age = 18;
p->next = q;
strcpy(q->name, "Jerry");
q->age = 19;
q->next = NULL;// 遍历结构体链表
struct student *temp = head;
while (temp != NULL) {
printf("Name: %s, Age: %d\n", temp->name, temp->age);
temp = temp->next;
}// 释放内存
free(p);
free(q);return 0;
}
```
在这个例子中,我们定义了一个结构体 `student`,其中包含了一个指向下一个结构体的指针 `next`。我们创建了三个结构体,并将它们串联起来,形成了一个链表。最后,我们遍历了这个链表,并释放了内存。
需要注意的是,当我们使用指针结构体时,需要特别小心,因为它们可能会导致内存泄漏和悬挂指针等问题。因此,我们需要确保在使用完指针结构体后,及时释放它们所占用的内存。
结构体指针和指针结构体是两个不同的概念。
结构体指针是指一个指向结构体变量的指针,它可以通过指针来访问结构体变量中的成员。例如:
```
struct Student {
char name[20];
int age;
};struct Student stu = {"Tom", 18};
struct Student *p = &stu;
printf("Name: %s, Age: %d\n", p->name, p->age);
```
指针结构体是指一个结构体,其中包含一个指针成员,这个指针成员指向另一个结构体。例如:
```
struct Node {
int data;
struct Node *next;
};struct Node node1 = {1, NULL};
struct Node node2 = {2, NULL};
node1.next = &node2;
```
在这个例子中,`Node` 结构体中的 `next` 成员是一个指向另一个 `Node` 结构体的指针,这样就可以通过指针访问链表中的下一个节点。
因此,结构体指针和指针结构体是两个不同的概念,需要根据具体的情况来选择使用哪种方式。
4.结构体成员的获取和赋值
结构体数组使用下标[ ]获取单个元素,普通结构体使用点号.获取单个成员,结构体指针变量用->或者加*和点号。
typedef struct { char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 }stu;//结构体数组
stu class[5]= { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }; //成员引用,数组名[下标].结构体成员,如引用结构体第一个元素第二个成员class[0].num//普通结构体
stu class,引用第结构体第二个成员 class.name ; class.num;
//结构体指针变量
stu *class;引用第结构体第一个成员 class->name; (*class).num
注意:结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。
二、枚举
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量。,它可以让数据更简洁,更易读。
枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。定义一个枚举类型,需要使用 enum 关键字,后面跟着枚举类型的名称,以及用大括号 {} 括起来的一组枚举常量。
每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。
枚举语法定义格式感觉有点像结构体,注意,元素的写法和数组一样,最后一个不用加逗号
enum 枚举名
{
枚举元素1,枚举元素2,……
};