结构体和枚举

目录

一、结构体

1.定义

3.结构体的类型

3.1结构体指针

3.2结构体数组

3.3指针结构体

4.结构体成员的获取和赋值

二、枚举


一、结构体

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,……

};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值