创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡><)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
c语言系列专栏:c语言之路重点知识整合
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ


结构体 目录

  • 一、结构体的定义
  • 二、. 操作符
  • 三、结构体数组
  • 四、结构体指针
    • 创建结构体指针:
    • 不同定义结构体指针的方法:
    • 不同方法使用指针操作结构体成员:

一、结构体的定义

结构体就是对数据类型的扩展,在一个结构体中可以存放多个类型的数据。

之前的枚举类型也是对数据类型的扩展,在定义结构体之前,可以先回忆一下枚举类型enum枚举类型的定义格式 | 基本用法

我们是这样创建枚举类型的:

enum card_type {身份证,学生证,银行卡}

然后可以使用typedef简化: (typedef知识点:typedef的基本用法)

typedef enum card_type CARD_TYPE;//简化后的用法CARD_TYPE a = 学生证;

有了枚举类型的经验,我们就可以继续创建结构体:

它是一种把现有的数据类型,根据表格里面数据的类型组织成一个类型的组合体


结构体想表达的就是类似表格的一种数据结构

结构体的定义格式:

struct 结构体名{类型 成员变量1;类型 成员变量2;....};

定义一个学生信息结构体:

#define 'M'//定义宏:M代表男,W代表女#define 'W'typedef enum card_type {身份证,学生证,JSZ} CARD_TYPE; //使用枚举简化证件类型struct stu_info{unsigned int stuNum;//学号CARD_TYPE cardType;//证件类型char cardNum[20];//证件号码char name[20];//姓名char sex;//性别};

赋初值:

struct stu_info s1={1,身份证,"123","天喜",M};

通过调试器查看:s1中存放了不同变量类型的值

二、. 操作符

我们已经定义了一个结构体类型s1,如何对结构体中某个单个的数据进行改变呢?又如何输出s1中的数据?

存取结构体成员值 用.操作符

struct stu_info s2;s2.stuNum = 2;s2.cardType = 身份证;//s1.cardNum = "654";//通过strcpy复制: strcpy(s1.cardNum, "123456");strcpy(s1.name, "张三");s1.sex =;

scanf输入数据:

struct stu_info s3;scanf("%d%d%s%s%c", &s3.stuNum,&s3.cardType,s3.cardNum,s3.name,&s3.sex);

通过printf打印时,一定要注意 输入单个字符前加个空格 因为%c也读取空格这个字符,否则就会出现下面M未被存入的情况


正确的依次输入输出:

struct stu_info s3;scanf("%d%d%s%s %c", &s3.stuNum,&s3.cardType,s3.cardNum,s3.name,&s3.sex);//输入单个字符前加个空格 因为%c也读取空格这个字符printf("%d %d %s %s %c", s3.stuNum,s3.cardType,s3.cardNum,s3.name,s3.sex);

结构体基本概念的全部代码(供自己调试查看):

#include #include #define 'M'#define 'W'int main(){/*定义一个结构体*/typedef enum card_type {身份证,学生证,JSZ} CARD_TYPE;/*创建结构体变量并赋初值*/struct stu_info{unsigned int stuNum;//学号CARD_TYPE cardType;//证件类型char cardNum[20];//证件号码char name[20];//姓名char sex;//性别};struct stu_info s1={1,身份证,"123","天喜",};/*存取结构体成员值 用.操作符*/struct stu_info s2;s2.stuNum = 2;s2.cardType = 身份证;//s1.cardNum = "654";strcpy(s1.cardNum, "123456");strcpy(s1.name, "张三");s1.sex =;struct stu_info s3;scanf("%d%d%s%s %c", &s3.stuNum,&s3.cardType,s3.cardNum,s3.name,&s3.sex);//输入单个字符前加个空格 因为%c也读取空格这个字符printf("%d %d %s %s %c", s3.stuNum,s3.cardType,s3.cardNum,s3.name,s3.sex);return 0;}

三、结构体数组

首先定义一个book结构体

/*定义一个结构体*/typedef struct book{int year;//年份double prince;//价格char bookName[50];//书名char author[20];//作者} BOOK;

使用结构体类型名定义数组即为结构体数组

BOOKbooks[] = { {1992,23.5,"活着","余华"},{2008,59.0,"三体","刘慈欣"},{1992,48.8,"白鹿原","陈忠实"},{1989,38.0,"我与地坛","史铁生"}};

调试器查看: 存在了栈区中的结构体数组

同样通过 . 操作运算符进行遍历、输出

结构体数组全部代码(供自己调试查看):

#include #include /*定义一个结构体*/typedef struct book{int year;//年份double prince;//价格char bookName[50];//书名char author[20];//作者} BOOK;int main(){/*创建结构体数组变量*/BOOKbooks[] = { {1992,23.5,"活着","余华"},{2008,59.0,"三体","刘慈欣"},{1992,48.8,"白鹿原","陈忠实"},{1989,38.0,"我与地坛","史铁生"}};//按年份排序for (int i = 0; i < 4 - 1; i++){for (int j = i + 1; j < 4; j++){if (books[i].year > books[j].year|| books[i].year == books[j].year&& books[i].prince < books[j].prince){BOOK t; t = books[i]; books[i] = books[j]; books[j] = t;}}}for (int i = 0; i < 4; i++){printf("%-6d%6.2f %-20s%-20s\n", books[i].year, books[i].prince, books[i].bookName, books[i].author);}return 0;}

四、结构体指针

创建结构体指针:

直接在结构体后面定义指针变量:

#include /*定义一个结构体*/typedef struct book{int year;//年份double prince;//价格char bookName[50];//书名char author[20];//作者} BOOK, *P_BOOK;/*创建结构体指针变量*///指针模型int a = 3;//直接访问空间int* p = &a;//间接访问空间*p = 5;BOOKbooks[] = {{1992,23.5,"活着","余华"},{2008,59.0,"三体","刘慈欣"},{1992,48.8,"白鹿原","陈忠实"},{1989,38.0,"我与地坛","史铁生"}};

不同定义结构体指针的方法:

struct book* p1=&books[0];BOOK* p2 = books;P_BOOK p3 = &books[3];

不同方法使用指针操作结构体成员:

方式一: (*指针).成员

先*取得整体空间,再通过 . 取得成员空间

printf("%s\n", (*p1).bookName);

方式二: 指针 -> 成员

用指针指向某结构体内的成员

printf("%s\n", p1->bookName);

结构体指针全部代码(供自己调试查看):

#include /*定义一个结构体*/typedef struct book{int year;//年份double prince;//价格char bookName[50];//书名char author[20];//作者} BOOK, *P_BOOK;//typedef BOOK* P_BOOK;int main(){/*创建结构体指针变量*///指针模型int a = 3;//直接访问空间int* p = &a;//间接访问空间*p = 5;BOOKbooks[] = {{1992,23.5,"活着","余华"},{2008,59.0,"三体","刘慈欣"},{1992,48.8,"白鹿原","陈忠实"},{1989,38.0,"我与地坛","史铁生"}};//不同定义结构体指针的方法:struct book* p1=&books[0];BOOK* p2 = books;P_BOOK p3 = &books[3];/*使用指针操作结构体成员方式一:(*指针).成员 方式二:指针 -> 成员 */printf("%s\n", (*p1).bookName);printf("%s\n", p1->bookName);return 0;}

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。

大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●’◡’●)