写点什么

C 语言 _ 结构体总结

作者:DS小龙哥
  • 2022 年 5 月 13 日
  • 本文字数:3723 字

    阅读完需:约 12 分钟

当前文章介绍动态堆空间内存分配与释放,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; } else { return 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 MyStruct{ char a; int b; float c; char str[100];};int main(){ struct MyStruct data={'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 MyStruct{ char a; int b; float c; char str[100];}data={'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 MyStruct{ char 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 MyStruct{ char 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 MyStruct{  char a;  int b;  float c;  char str[100];}; 
int main(){ //struct MyStruct buff[100]; //struct MyStruct *data=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.根据学号删除学生信息。


示例:


#include "stdio.h"#include "string.h"#include <stdlib.h>
//定义存放学生信息的结构体类型struct StuDentInfo{ char Name[20]; //姓名 int number; //学号 char phone[20];//电话号码};
//全局变量区域unsigned int StuDentCnt=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"); }}
复制代码


发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
C语言_结构体总结_5 月月更_DS小龙哥_InfoQ写作社区