创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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 <stdio.h>
#include <stdlib.h>
#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;
使用结构体类型名定义数组即为结构体数组:
BOOK books[] = {
{1992,23.5,"活着","余华"},
{2008,59.0,"三体","刘慈欣"},
{1992,48.8,"白鹿原","陈忠实"},
{1989,38.0,"我与地坛","史铁生"}
};
调试器查看: 存在了栈区中的结构体数组
同样通过 . 操作运算符进行遍历、输出
结构体数组全部代码(供自己调试查看):
#include <stdio.h>
#include <stdlib.h>
/*定义一个结构体*/
typedef struct book
{
int year;//年份
double prince;//价格
char bookName[50];//书名
char author[20];//作者
} BOOK;
int main()
{
/*创建结构体数组变量*/
BOOK books[] = {
{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 <stdio.h>
/*定义一个结构体*/
typedef struct book
{
int year;//年份
double prince;//价格
char bookName[50];//书名
char author[20];//作者
} BOOK, *P_BOOK;
/*创建结构体指针变量*/
//指针模型
int a = 3;//直接访问空间
int* p = &a;
//间接访问空间
*p = 5;
BOOK books[] = {
{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 <stdio.h>
/*定义一个结构体*/
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;
BOOK books[] = {
{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;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |