C语言_结构体总结,附实例源码

点击蓝字

37380d28995f20fa9e3409614df479cd.png

关注我们

当前文章介绍动态堆空间内存分配与释放,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 定义语法

结构体的概念: 可存放不同数据类型的集合。比如: 存放一个班级学生的信息。可以使用一个结构体存放一个学生的信息。一个结构体数组存放整个班级的学习信息。数组的概念: 可存放相同数据类型的集合。微信搜索公众号:C语言中文社区,免费领取精品学习资料。

结构体的定义语法:

//声明一种新类型-----数据类型
 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");
 }
}

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

ded6146a5b0c90568ae4227a55f0b27e.png

1c2e7856d4201399f5f607c31f921f2a.gif

戳“阅读原文”我们一起进步

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值