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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四大C语言知识总结

点击蓝字关注我们1、#define宏定义以#号开头的都是编译预处理指令&#xff0c;它们不是C语言的成分&#xff0c;但是C程序离不开它们&#xff0c;#define用来定义一个宏&#xff0c;程序在预处理阶段将用define定义的来内容进行了替换。因此在程序运行时&#xff0c;常量表中并…

jdbc select语句_SELECT语句使用JDBC和Hibernate批量获取

jdbc select语句介绍 现在&#xff0c;我已经介绍了Hibernate对INSERT &#xff0c; UPDATE和DELETE语句的批处理支持&#xff0c;是时候分析SELECT语句结果集的批量提取了。 JDBC ResultSet提供了一个客户端Proxy游标&#xff0c;用于获取当前语句的返回数据。 执行该语句后&…

看懂开源项目,你得熟悉这几个 C++11 新特性

点击蓝字关注我们C11 中增加了许多的新特性。在本文中&#xff0c;我们来聊一下 lambda 表达式&#xff0c;闭包&#xff0c;std::function以及std::bind。lambda 表达式C11 中新增了 lambda 表达式这一语言特性。lambda 表达式可以让我们快速和便捷的创建一个 “函数”。下面是…

5元素升级android6,【五元素ifive X.7】无障碍升级,ifveX详细升级固件教程,快为爱机升级吧。...

android系统的乐趣就是可以随意的刷机&#xff0c;所以拿到如此高配置的ifiveX也是想随时体验最新的android系统。而很多朋友可能只会用设备&#xff0c;刷机这种比较技术性的动作就不太会弄了。也就在这周&#xff0c;才帮同事刷RUU把已经无法启动的G12刷了回来。所以刷机还是…

昆仑通态复制的程序可以用吗_昆仑通态专题(七):MCGS组态软件的设备窗口...

点击上方蓝色字体&#xff0c;关注我们设备窗口是MCGS嵌入版组态软件系统的重要组成部分&#xff0c;在设备窗口中建立系统与外部硬件设备的连接关系&#xff0c;使系统能够从外部设备读取数据并控制外部设备的工作状态&#xff0c;实现对工业过程设备的实时监控与操作。01 设备…

嵌入式C语言程序调试和宏使用的技巧

点击蓝字关注我们01.调试相关的宏在Linux使用gcc编译程序的时候&#xff0c;对于调试的语句还具有一些特殊的语法。gcc编译的过程中&#xff0c;会生成一些宏&#xff0c;可以使用这些宏分别打印当前源文件的信息&#xff0c;主要内容是当前的文件、当前运行的函数和当前的程序…

matlab中欠定方程组超定方程组_《数值天气预报》:球坐标系中的基本方程组

人们是如何预报天气的&#xff1f;目前的预报方法主要有两种&#xff1a;一种是基于由各种探测资料绘制的天气图&#xff0c;结合历史资料进行分析预测&#xff1b;另一种是基于大气方程组&#xff0c;利用数值解法对其进行求解&#xff0c;从而得到未来时刻的大气状态。后者就…

浏览器总是跳转到缓存界面_跳转到企业缓存之前要考虑的事项

浏览器总是跳转到缓存界面介绍 关系数据库事务是ACID &#xff0c;强大的一致性模型简化了应用程序开发。 由于启用Hibernate缓存是一项配置 &#xff0c;因此&#xff0c;只要数据访问层开始出现性能问题&#xff0c;就转向缓存非常吸引人。 添加缓存层确实可以提高应用程序性…

CryptoTab 服务器_如何架设FTP服务器,如何架设FTP服务器,具体架设方法

FTP服务器&#xff0c;则是在互联网上提供存储空间的计算机&#xff0c;它们依照FTP协议提供服务。 FTP的全称是File Transfer Protocol(文件传输协议)。顾名思义&#xff0c;就是专门用来传输文件的协议。简单地说&#xff0c;支持FTP协议的服务器就是FTP服务器。那么&#xf…

C语言和C++的区别和联系

点击蓝字关注我们C语言和C到底是什么关系&#xff1f;首先C和C语言本来就是两种不同的编程语言&#xff0c;但C确实是对C语言的扩充和延伸&#xff0c;并且对C语言提供后向兼容的能力。对于有些人说的C完全就包含了C语言的说法也并没有错。C一开始被本贾尼斯特劳斯特卢普&#…

hibernate语句_如何优化Hibernate EllementCollection语句

hibernate语句介绍 Hibernate支持三种数据映射类型 &#xff1a; 基本 &#xff08;例如String&#xff0c;int&#xff09;&#xff0c; Embeddable和Entity 。 通常&#xff0c;数据库行被映射到Entity &#xff0c;每个数据库列都与一个基本属性相关联。 当将多个字段映射组…

C++ 虚函数表剖析

点击蓝字关注我们一、概述为了实现C的多态&#xff0c;C使用了一种动态绑定的技术。这个技术的核心是虚函数表&#xff08;下文简称虚表&#xff09;。本文介绍虚函数表是如何实现动态绑定的。二、类的虚表每个包含了虚函数的类都包含一个虚表。我们知道&#xff0c;当一个类&a…

aix pax_通过Pax考试对JBoss Fuse 6.x进行集成测试,第一部分

aix paxJBoss Fuse是一个功能强大的分布式集成平台&#xff0c;具有内置功能&#xff0c;可用于针对集成的微服务部署进行集中式配置管理&#xff0c;服务发现&#xff0c;版本控制&#xff0c;API网关&#xff0c;负载平衡&#xff0c;故障转移等。 JBoss Fuse 6.x构建在Fabri…

android王者调不了界面,王者荣耀登录界面怎么改?登录界面更改教程[多图]

王者荣耀登录界面怎么改&#xff1f;许多玩家都想更改自己登陆的界面&#xff0c;但是都不清楚&#xff0c;下面就让安卓乐园小编为大家带来&#xff0c;登录界面更改教程。王者荣耀登录界面怎么改&#xff1f;1、安卓手机打开文件管理&#xff0c;找到根目录下Android/data/co…

y空间兑换代码_Python爬虫实战:QQ空间全自动点赞工具

QQ空间自动点赞前景提要目标确定分析介绍登陆获取cookie寻找XML寻找可变参数获取第一个空间动态寻找点赞所需的URL寻找可变参数功能提升到秒赞全部代码最后还是希望你们能给我点一波小小的关注。奉上自己诚挚的爱心私信小编01即可获取大量Python学习资料前景提要因为我周围的小…

学点 STL C++ 无序容器和元组

点击蓝字关注我们无序容器我们已经熟知了传统 C 中的有序容器 std::map/std::set&#xff0c;这些元素内部通过红黑树进行实现&#xff0c; 插入和搜索的平均复杂度均为 O(log(size))。在插入元素时候&#xff0c;会根据 < 操作符比较元素大小并判断元素是否相同&#xff0c…

html中的文档格式及举例,跟我一起从零开始学习WebAssembly(三)、最简单的例子hello world(使用自定义HTML模板)...

文章目录创建C代码片创建我们的自定义HTML模板文件编译运行实例有时我们想要使用我们自定义HTML模板。让我们来看看我们如何做到这一点。创建C代码片首先&#xff0c;创建一个名为hello2的目录。其次&#xff0c;在该目录下创建一个名为hello2.c文件。并将以下C代码保存在文件中…

设计模式适配器模式_21世纪的设计模式:适配器模式

设计模式适配器模式这是我的演讲的第三部分&#xff0c;“ 21世纪的设计模式” 。 适配器模式桥接世界。 在一个世界中&#xff0c;我们有一个概念的界面。 在另一个世界&#xff0c;我们有不同的界面。 这两个接口有不同的用途&#xff0c;但有时我们需要进行转移。 在编写良…

excel单元格斜线_掌握这20个Excel技巧,小白轻松变大神

掌握一些Excel小技巧&#xff0c;可以让你的工作效率翻倍&#xff0c;原本半个小时才能搞定的&#xff0c;现在几秒就可以轻松搞定。1、调整单元格大小选中表格&#xff0c;将光标移到表格顶部边框处&#xff0c;等其变成双向箭头即可移动。2、快速插入空行选中行&#xff0c;按…

html鼠标滚动效果代码,JS+CSS实现大气清新的滑动菜单效果代码

本文实例讲述了JSCSS实现大气清新的滑动菜单效果代码。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这是一款比较大气清新的滑动导航菜单&#xff0c;CSS和JavaScript配合完成&#xff0c;鼠标放到一级菜单上&#xff0c;会滑出二级的菜单&#xff0c;兼容性也不错&a…