C语言_结构体总结

仓廪实则知礼节,衣食足则知荣辱。这篇文章主要讲述C语言_结构体总结相关的知识,希望能为你提供帮助。
当前文章介绍动态堆空间内存分配与释放,C语言结构体定义、初始化、赋值、结构体数组、结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用。
1. 动态内存管理C语言代码-----> 编译-----> 链接------> 可执行的二进制文件(windows下xxx.exe)
二进制文件中的数据是如何摆放的?文本数据段、静态数据段、全局数据段。
堆栈空间: 代码在运行的时候才有的空间。
栈空间:系统负责申请,负责释放。比如: 函数形参变量、数组……
堆空间:程序员负责申请,负责释放。

#include < stdlib.h> //标准库头文件 void *malloc(int size); //内存申请。 形参表示申请的空间大小,返回值:申请的空间的地址 void free(void *p); //内存释放。 形参就是要释放的空间首地址。

动态空间申请示例。
动态空间申请 #include "stdio.h" #include "string.h" #include < stdlib.h> int main()int *p=malloc(sizeof(int)); //申请空间 if(p!=NULL)printf("申请的空间地址: 0x%X\\n",p); *p=888; printf("%d\\n",*p); free(p); //释放空间 return 0; 示例2: #include "stdio.h" #include "string.h" #include < stdlib.h> char *func(void)char*str=malloc(100); //char str[100]; if(str!=NULL)strcpy(str,"1234567890"); printf("子函数打印:%s\\n",str); //free(str); //释放空间 return str; elsereturn NULL; int main()char *p=func(); printf("主函数打印:%s\\n",p); return 0;

2. 结构体 2.1 定义语法
结构体的概念:可存放不同数据类型的集合。
比如: 存放一个班级学生的信息。
可以使用一个结构体存放一个学生的信息。
一个结构体数组存放整个班级的学习信息。
数组的概念:可存放相同数据类型的集合。
结构体的定义语法:
//声明一种新类型-----数据类型 struct < 结构体的名称> < 结构体的成员> 1; < 结构体的成员> 2; ………… ; //最后有分号结束struct MyStruct char a; int b; float c; char str[100]; ;

2.2 定义示例
结构体如何赋值? 如何访问结构体内部成员
#include "stdio.h" #include "string.h" #include < stdlib.h> //定义结构体数据类型 struct MyStructchar a; int b; float c; char str[100]; ; int main()struct MyStruct data=https://www.songbingjia.com/android/A,123,456.789,"abcd"; //data就是结构体类型的变量 //结构体变量访问内部成员的语法:. 点运算符 printf("%c\\n",data.a); printf("%d\\n",data.b); printf("%f\\n",data.c); printf("%s\\n",data.str); return 0;

2.3 初始化
#include "stdio.h" #include "string.h" #include < stdlib.h> //定义结构体数据类型 struct MyStructchar a; int b; float c; char str[100]; data=https://www.songbingjia.com/android/A,123,456.789,"abcd"; //data就是结构体类型的变量int main()//结构体变量访问内部成员的语法:. 点运算符 printf("%c\\n",data.a); printf("%d\\n",data.b); printf("%f\\n",data.c); printf("%s\\n",data.str); return 0;

2.4 结构体赋值
//结构体变量访问内部成员的语法:. 点运算符 #include "stdio.h" #include "string.h" #include < stdlib.h> //定义结构体数据类型 struct MyStructchar a; int b; float c; char str[100]; ; int main()struct MyStruct data; //data就是结构体类型的变量 //成员单独赋值 data.a=A; data.b=123; data.c=456.789; strcpy(data.str,"abcd"); //数组赋值//结构体变量访问内部成员的语法:. 点运算符 printf("%c\\n",data.a); printf("%d\\n",data.b); printf("%f\\n",data.c); printf("%s\\n",data.str); return 0;

2.5 结构体数组
结构体赋值分为两种标准:C89 、C99 ?结构体数组 #include "stdio.h" #include "string.h" #include < stdlib.h> //定义结构体数据类型 struct MyStructchar a; int b; float c; char str[100]; ; int main()struct MyStruct data[100]; //data就是结构体数组类型变量 struct MyStruct data2[50]; //成员单独赋值 data[0].a=A; data[0].b=123; data[0].c=456.789; strcpy(data[0].str,"abcd"); //数组赋值//结构体变量访问内部成员的语法:. 点运算符 printf("%c\\n",data[0].a); printf("%d\\n",data[0].b); printf("%f\\n",data[0].c); printf("%s\\n",data[0].str); return 0;

2.6 结构体指针赋值
#include "stdio.h" #include "string.h" #include < stdlib.h> //定义结构体数据类型 struct MyStructchar a; int b; float c; char str[100]; ; int main()//struct MyStruct buff[100]; //struct MyStruct *data=https://www.songbingjia.com/android/buff; //结构体指针类型变量struct MyStruct *data=malloc(sizeof(struct MyStruct)); data-> a=A; data-> b=123; data-> c=456.789; strcpy(data-> str,"abcd"); //结构体指针访问内部成员的变量 通过-> 运算符。 printf("%c\\n",data-> a); printf("%d\\n",data-> b); printf("%f\\n",data-> c); printf("%s\\n",data-> str); return 0;

3. 学生管理系统作业:学生管理系统
需求:(每一个功能都是使用函数进行封装)
1.实现从键盘上录入学生信息。 (姓名、性别、学号、成绩、电话号码)
2.将结构体里的学生信息全部打印出来。
3.实现根据学生的姓名或者学号查找学生,查找到之后打印出学生的具体信息。
4.根据学生的成绩对学生信息进行排序。
5.根据学号删除学生信息。
【C语言_结构体总结】示例:
#include "stdio.h" #include "string.h" #include < stdlib.h> //定义存放学生信息的结构体类型 struct StuDentInfochar Name[20]; //姓名 int number; //学号 char phone[20]; //电话号码 ; //全局变量区域 unsigned intStuDentCnt=0; //记录已经录入的全部学生数量//函数声明区域 void PrintStuDentInfoList(void); void InputStuDentInfo(struct StuDentInfo*info); void FindStuDentInfo(struct StuDentInfo*info); void SortStuDentInfo(struct StuDentInfo*info); void PrintStuDentInfo(struct StuDentInfo*info); int main()struct StuDentInfo data[100]; //可以100位学生的信息 int number; while(1)PrintStuDentInfoList(); //打印功能列表 scanf("%d",& number); printf("\\n"); switch(number)case 1: InputStuDentInfo(data); break; case 2: FindStuDentInfo(data); break; case 3: SortStuDentInfo(data); break; case 4: PrintStuDentInfo(data); break; case 5: break; default: printf("选择错误!\\n\\n"); break; return 0; /* 函数功能: 打印学生管理系统的功能列表 */ void PrintStuDentInfoList(void)printf("\\n--------------学生管理系统功能列表----------------\\n"); printf("1. 录入学生信息\\n"); printf("2. 根据学号查找学生信息\\n"); printf("3. 根据学号排序\\n"); printf("4. 打印所有学生信息\\n"); printf("5. 删除指定的学生信息\\n"); printf("请选择功能序号:"); /* 函数功能: 录入学生信息 */ void InputStuDentInfo(struct StuDentInfo*info)printf("输入学生姓名:"); scanf("%s",info[StuDentCnt].Name); printf("输入学号:"); scanf("%d",& info[StuDentCnt].number); printf("输入电话号码:"); scanf("%s",info[StuDentCnt].phone); StuDentCnt++; //数量自增/* 函数功能: 查找学生信息 */ void FindStuDentInfo(struct StuDentInfo*info)int num,i; printf("输入查找的学号:"); scanf("%d",& num); for(i=0; i< StuDentCnt; i++)if(info[i].number==num)printf("信息查找成功,该学生的信息如下:\\n"); printf("姓名:%s\\n",info[i].Name); printf("学号:%d\\n",info[i].number); printf("电话号码:%s\\n",info[i].phone); printf("\\n"); break; if(i==StuDentCnt)printf("----------%d学号不存在!---------\\n",num); /* 函数功能: 根据学号排序 */ void SortStuDentInfo(struct StuDentInfo*info)int i,j; struct StuDentInfo tmp; //保存临时信息 for(i=0; i< StuDentCnt-1; i++)for(j=0; j< StuDentCnt-i-1; j++)if(info[j].number> info[j+1].number)tmp=info[j]; info[j]=info[j+1]; info[j+1]=tmp; /* 函数功能: 打印所有学生信息 */ void PrintStuDentInfo(struct StuDentInfo*info)int i=0; printf("-----------所有学生的信息列表------------\\n"); for(i=0; i< StuDentCnt; i++)printf("姓名:%s\\n",info[i].Name); printf("学号:%d\\n",info[i].number); printf("电话号码:%s\\n",info[i].phone); printf("\\n");


    推荐阅读