导图社区 结构体
C语言之结构体知识梳理,包括结构体意义、结构体的使用、共用和枚举等等,大家一起学起来吧。
编辑于2022-11-20 11:06:59 河南结构体
结构体意义
不同数据类型变量的集合
char name[20];//姓名 int id;//学号 int score;//成绩
结构体的使用
结构体的定义
第一种 struct std { char name[20]; int id; int score; }; struct std student1; //先定义结构体类型struct std ,再用该类型定义变量
第二种: struct std { char name[20]; int id; int score; }student1; struct std student2; 定义类型的同时定义变量
第三种 struct { char name[20]; int id; int score; }student1,student2; //定义类型的同时定义变量,之后不能用于定义其他变量
定义的解释
#include "stdio.h" #include "string.h" struct STUDENT //-- 意义描述一个学生的基本信息 { int No;//学号 -- 4个字节 char Name[19];//姓名 -- 19个字节 float Score;//成绩 -- 4个字节 }; void main(void) { //1.找到最大类型 //2.求出所有空间之和(sum) //3.大小必须大于和并且为最大类型的整数倍 printf("%d\n",sizeof(struct STUDENT)); }
结构体的初始化
struct std student1 = {"张三",1,80};
struct std student2; student2 = {"李四",2,60};//错误 student2.id = 2;//int id student2.score = 60;//int score strcpy(student2.name,"李四");
变量的定义以及使用
结构体变量定义和初始化
#include "stdio.h" #include "string.h" struct STUDENT //-- 意义描述一个学生的基本信息 { int No;//学号 -- 4个字节 char Name[19];//姓名 -- 19个字节 float Score;//成绩 -- 4个字节 }; void main(void) { //不初始化 struct STUDENT student_hesi; //初始化 struct STUDENT student_li = {120301,"李明伟",90.0}; }
使用
#include "stdio.h" #include "string.h" struct STUDENT //-- 意义描述一个学生的基本信息 { int No;//学号 -- 4个字节 char Name[19];//姓名 -- 19个字节 float Score;//成绩 -- 4个字节 }; void main(void) { //不初始化 struct STUDENT student_he; //初始化 struct STUDENT student_li = {120301,"李明伟",90.0}; //成员的使用 -- 使用时和普通变量一样 //结构体变量名.成员名 //输入何思的信息 printf("学号:"); scanf("%d",&student_he.No); printf("姓名:"); scanf("%s",student_he.Name); printf("成绩:"); scanf("%f",&student_he.Score); //输出李明伟的相关信息 printf("学号\t姓名\t成绩\n"); printf("%d\t%s\t%f\n",student_li.No,student_li.Name,student_li.Score); printf("%d\t%s\t%f\n",student_he.No,student_he.Name,student_he.Score); }
注意:结构体可以相互赋值
结构体的大小
struct tag { char b;//4 int a; //4 char str[5];//8 };
每次开辟内存空间都是最大数据类型的大小
从上往下存储
结构体元素的访问
#include "stdio.h" #include "string.h" struct STUDENT //-- 意义描述一个学生的基本信息 { int No;//学号 -- 4个字节 char Name[19];//姓名 -- 19个字节 float Score;//成绩 -- 4个字节 }; void main(void) { //不初始化 struct STUDENT student_he = {120302,"何思",90.0}; //初始化 struct STUDENT student_li = {120301,"李明伟",90.0}; struct STUDENT * pstudent = NULL; pstudent = &student_he; printf("学号\t姓名\t成绩\n"); printf("%d\t%s\t%f\n",student_li.No,student_li.Name,student_li.Score); printf("%d\t",pstudent->No); printf("%s\t",pstudent->Name); printf("%f\n",(*pstudent).Score); }
通过变量名
#include struct std { char name[20]; int id; int score; }student1 = {"张三",1,80}; struct std student2 = {"里斯",2,70}; int main() { // struct std *p=&student2; printf("姓名:%s,id:%-3d,成绩:%-3d\n",student1.name,student1.id,student1.score); //printf("姓名:%s,id:%-3d,成绩:%-3d\n",p->name,p->id,p->score); return 0; }
变量名.成员名
通过指针
#include struct std { char name[20]; int id; int score; }; struct std student[3]; int main() { int i; printf("请输入学生信息\n"); for(i=0;i { scanf("%s%d%d",student[i].name,&student[i].id,&student[i].score); } for(i=0;i { printf("name:%-5sid:%-3dscore%-3d\n",student[i].name,student[i].id,student[i].score); } return 0; }
指针名->成员名
不常用:(*指针名).成员名
结构体首地址:&变量名
共用体
可以理解为一个特殊的结构体,数据元素共用内存空间
union share { int a; char str[4]; };
一个整形变量a=0x12345678,打印整形空间每个字节内存放的内容
#include union share { unsigned int a; char str[4]; }; union share share1; int main() { int i; share1.a = 0x12345678; for(i=0;i { printf("%-5x",share1.str[i]); } return 0; }
枚举
把变量可能出现的结果给一一列举出来
enum 枚举类型名{枚举常量1,枚举常量2,枚举常量3....};
#include enum day { monday=1,tuesday,wednesday }; enum day workday; int main() { scanf("%d",&workday); switch(workday) { case monday:printf("1111\n");break; case tuesday:printf("2222\n");break; case wednesday:printf("3333\n");break; } return 0; }