广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言结构体实例分析
  • 529
分享到

C语言结构体实例分析

2023-06-29 18:06:37 529人浏览 独家记忆
摘要

这篇文章主要介绍“C语言结构体实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言结构体实例分析”文章能帮助大家解决问题。1. 动态内存管理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;     }     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");}}

附:结构体变量的存储原理

1)结构体数据成员对齐的意义

内存是以字节为单位编号的,某些硬件平台对特定类型的数据的内存要求从特定的地址开始,如果数据的存放不符合其平台的要求,就会影响到访问效率。所以在内存中各类型的数据按照一定的规则在内存中存放,就是对齐问题。而结构体所占用的内存空间就是每个成员对齐后存放时所占用的字节数之和。

计算机系统对基本数据类型的数据在内存中存放的限制是:这些数据的起始地址的值要求是某个数K的倍数,这就是内存对齐,而这个数 K 就是该数据类型的对齐模数(alignment modulus)。这样做的目的是为了简化处理器与内存之间传输系统的设计,并且能提升读取数据的速度。

结构体对齐不仅包括其各成员的内存对齐(即相对结构体的起始位置),还包括结构体的总长度。

2)结构体大小的计算方法和步骤

i. 将结构体内所有数据成员的长度值相加,记为 sum_a ;

ii. 将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到sum_a上,记为sum_b。

对齐模数是 #pragma pack 指定的数值与该数据成员自身长度相比较得到的数值较小者。该数据相对起始位置应该是对齐模数的整数倍。

iii. 将和 sum_b 向结构体模数对齐。

该模数则是 #pragma pack 指定的数值与结构体内最大的基本数据类型成员长度相比较得到的数值较小者。结构体的长度应该是该模数的整数倍。

数据类型自身对齐:

所谓“对齐在N上”,是指“存放的起始位置是%N = 0”.

关于“C语言结构体实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网其他教程频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: C语言结构体实例分析

本文链接: https://www.lsjlt.com/news/326056.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言结构体实例分析
    这篇文章主要介绍“C语言结构体实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言结构体实例分析”文章能帮助大家解决问题。1. 动态内存管理C语言代码----->编译----->...
    99+
    2023-06-29
  • C语言结构体应用实例分析
    这篇文章主要介绍“C语言结构体应用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言结构体应用实例分析”文章能帮助大家解决问题。1、结构体的声明1.1 结构的基础知识结构是一些值的集合,这...
    99+
    2023-06-30
  • C语言中结构体实例解析
    目录一.结构体定义二.实例演示结构体作为函数参数结构体指针三.typedef struct 和 struct的区别1、声明不同2、访问成员变量不同3、重新定义不同总结一.结构体定义 ...
    99+
    2022-11-13
  • C语言结构体指针的示例分析
    这篇文章给大家分享的是有关C语言结构体指针的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。写结构体指针前,先说一下 . 号和 -> 的区别记得当初刚学C语言的...
    99+
    2023-06-20
  • C语言中结构体和共用体的示例分析
    这篇文章给大家分享的是有关C语言中结构体和共用体的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、实验目的掌握结构体类型变量的定义和使用;掌握结构体类型数组的概念和应用;掌握链表的概念,初步学会对链表进...
    99+
    2023-06-20
  • C语言结构体指针案例解析
    写结构体指针前,先说一下 . 号和 -> 的区别 记得当初刚学C语言的时候,搞不清结构体的 . 号和 -> ,经常混淆二...
    99+
    2022-11-12
  • C语言结构体详细图解分析
    目录结构体结构体的声明结构体变量的定义和初始化结构体大小计算结构体 结构是一些值的集合,这些值称为成员变量。结构的每个成员是不同类型的变量。 为什么要有结构体 比如说,描述一个学生时...
    99+
    2022-11-13
  • Go 语言结构实例分析
    当前的调试部分可以使用 go run filename.go 来执行。 可以生成一个 build.sh 脚本,用于在指定位置产生已编译好的 可执文件: #!/usr/bin/en...
    99+
    2022-11-12
  • C语言中结构体与内存对齐实例解析
    1.结构体类型 C语言中的2种类型:原生类型和自定义类型,结构体类型是一种自定义类型。 2.结构体使用时先定义结构体类型再用类型定义变量 -> 结构体定义时需要先定义结构体类型...
    99+
    2022-11-12
  • C#结构体构造函数的实例分析
    这期内容当中小编将会给大家带来有关C#结构体构造函数的实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#结构体构造函数的应用是如何的呢?C#结构体构造函数的实例1、  &nbs...
    99+
    2023-06-18
  • C语言中结构体和共用体实例教程
    目录一、实验目的二、实验内容三、实验记录3.1 候选人选票统计3.2 print函数3.3 链表总结一、实验目的 掌握结构体类型变量的定义和使用; 掌握结构体类型...
    99+
    2022-11-12
  • C语言结构体字节对齐的实现深入分析
    目录前言一、什么是字节对齐二、结构体字节对齐三、#pragma pack()的使用总结前言 本教程可能会用到一点汇编的知识,看不懂没关系,知道是那个意思就行了。使用的工具是vs201...
    99+
    2022-11-13
    C语言结构体字节对齐 C语言字节对齐
  • C语言详细分析结构体的内存对齐
    目录一.结构体二.结构体内存对齐1.非嵌套结构体的大小2.含嵌套结构体的大小三.为什么要内存对齐1.平台原因(移植原因)2.性能原因一.结构体 结构体 (struct)是一种数据结构...
    99+
    2022-11-13
  • C语言数据结构堆排序示例分析
    今天小编给大家分享一下C语言数据结构堆排序示例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。TOP.堆排序前言什么是堆排...
    99+
    2023-06-30
  • 浅谈C语言结构体
    目录前言什么是结构体结构体类型的声明结构的自引用结构体变量的定义和初始化结构体的使用结构体内存对齐结构体传参总结前言 在C语言中,除了内置的许多数据类型,C语言还为我们提供了自定义的...
    99+
    2022-11-12
  • Go语言结构的示例分析
    这篇文章主要为大家展示了“Go语言结构的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go语言结构的示例分析”这篇文章吧。当前的调试部分可以使用 go run filename.go 来...
    99+
    2023-06-20
  • C语言中使用结构体计算内存占用的示例分析
    小编给大家分享一下C语言中使用结构体计算内存占用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!    c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(c...
    99+
    2023-06-20
  • C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
    结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(name) :char [ ] 型性别(sex):c...
    99+
    2023-08-30
    c语言 开发语言
  • C语言结构化程序设计的示例分析
    这篇文章主要为大家展示了“C语言结构化程序设计的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言结构化程序设计的示例分析”这篇文章吧。C语言是结构化的程序设计语言!结构有三大类:顺序...
    99+
    2023-06-20
  • C语言数据结构之绪论的示例分析
    小编给大家分享一下C语言数据结构之绪论的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!绪论什么是数据结构?不同于计算机操作培训,注意与程序设计的区别。Ex...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作