仓廪实则知礼节,衣食足则知荣辱。这篇文章主要讲述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");
推荐阅读
- netstat命令在Linux上的用法
- 红日ATT&CK实战系列靶机
- 华为防火墙网关间通过IKE方式协商IPSec VPN隧道(共享密钥认证)
- 重读 ES6 标准入门(第3版)
- 常用的好用的window工具
- git配置提交代码时需要的的用户名和邮箱
- Docker下的OpenResty三部曲之终篇(OpenResty加Tomcat的服务)
- git常用的命令
- MyBatis学习