0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言_结构体总结

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-08-14 09:52 次阅读

当前文章介绍动态堆空间内存分配与释放,C语言结构体定义、初始化、赋值、结构体数组、结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用。

1. 动态内存管理

C语言代码----->编译----->链接------>可执行的二进制文件(windows下xxx.exe)
二进制文件中的数据是如何摆放的? 文本数据段、静态数据段、全局数据段。

堆栈空间: 代码在运行的时候才有的空间。
栈空间: 系统负责申请,负责释放。比如: 函数形参变量、数组……
堆空间: 程序员负责申请,负责释放。

#include      //标准库头文件
void *malloc(int size); //内存申请。 形参表示申请的空间大小,返回值:申请的空间的地址
void free(void *p);     //内存释放。 形参就是要释放的空间首地址。

动态空间申请示例。

动态空间申请
#include "stdio.h"
#include "string.h"
#include 
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 

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 

//定义结构体数据类型
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 

//定义结构体数据类型
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 

//定义结构体数据类型
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 

//定义结构体数据类型
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 
//定义结构体数据类型
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 

//定义存放学生信息的结构体类型
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; iinfo[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

;i++)>;>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136130
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10833
收藏 人收藏

    评论

    相关推荐

    嵌入式C语言知识点总结

    怎么才能做好嵌入式开发?学好C语言吧!今天就来推荐一篇大佬写的嵌入式C语言知识点总结
    发表于 09-27 09:53 1162次阅读

    漫谈C语言结构

      相信大家对于结构体都不陌生。在此,分享出本人对c语言结构体的学习心得。如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了。当
    发表于 11-15 15:59

    C语言_指针总结_经典讲解

    C语言_指针总结_经典讲解。
    发表于 01-06 13:47 10次下载

    dxp整体总结

    自己整体做了个简单整体总结,分享给大家,一个dxp的过程,包括常用的快捷键,布线,
    发表于 08-31 16:28 0次下载

    C语言字符串操作总结大全(超详细)

    本文对c语言字符串的操作进行了详细的总结分析,需要的朋友可以参考。
    发表于 11-15 14:19 2067次阅读

    C语言入门教程之顺序结构总结的详细资料概述

    本文档的主要内容详细介绍的是C语言入门教程之顺序结构总结的详细资料概述主要内容包括了:1 赋值语句2 数据输出3 数据输入4 复合语句和空语句5 程序举例
    发表于 10-23 17:53 2次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>入门教程之顺序<b class='flag-5'>结构</b><b class='flag-5'>总结</b>的详细资料概述

    C语言入门教程之循环结构总结的详细资料概述

    本文档的主要内容详细介绍的是C语言入门教程之循环结构总结的详细资料概述。主要内容包括了:1 while语句和用while语句构成的循环结构2
    发表于 10-23 17:53 2次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>入门教程之循环<b class='flag-5'>结构</b><b class='flag-5'>总结</b>的详细资料概述

    适合C语言小白看的基础知识梳理总结

    C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结C
    的头像 发表于 01-04 11:07 4710次阅读

    C语言教程之C基础变量的技术总结

    本文档的主要内容详细介绍的是C语言教程之C基础变量的技术总结
    发表于 01-22 16:18 11次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>教程之<b class='flag-5'>C</b>基础变量的技术<b class='flag-5'>总结</b>

    总结那么几个C语言中的“坑”

    总结几个C语言中的“坑”
    的头像 发表于 01-16 10:52 2547次阅读

    C语言的拓展归纳总结详细说明

    本文档的主要内容详细介绍的是C语言的拓展归纳总结详细说明。
    发表于 07-29 08:00 2次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的拓展归纳<b class='flag-5'>总结</b>详细说明

    嵌入式C语言知识总结

    1 嵌入式C语言总结从语法上来说C语言并不复杂, 但编写优质可靠的嵌入式C程序并非易事,不仅需要
    发表于 12-20 19:44 12次下载
    嵌入式<b class='flag-5'>C</b><b class='flag-5'>语言</b>知识<b class='flag-5'>总结</b>

    C语言C++面试知识点总结

    相对而言,C语言C++相关的面试题比较少见,没有Java方向写的人那么多,这是一篇 C 语言C
    的头像 发表于 05-12 14:59 1429次阅读

    C语言C++面试知识点总结

    相对而言,C语言C++相关的面试题比较少见,没有Java方向写的人那么多,这是一篇 C 语言C
    的头像 发表于 05-13 11:59 1828次阅读

    C语言_链表总结

    本篇文章介绍C语言链表相关知识点,涉及链表的创建、单向链表、循环链表、双向链表、单向循环链表,链表常见问题总结等,还列出了结构体数组与链表的练习题,将在下篇文章贴出完整代码。
    的头像 发表于 08-14 09:53 1750次阅读