C语言入门系列 - 结构体

C语言入门系列 - 结构体

第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
第十一节 结构体
第十二节 链表
第十三节 共用体union,枚举enum,宏定义#define,条件编译,const与指针
C语言–图书管理项目



前言

基本数据类型
数组类型
指针类型
结构体也是数据类型。

统计一个班的成绩 – 数组 {620,720,530}
有大有小,按照成绩排序-- 最高分,
但是如果需要知道谁是最高分 – 同学的名字获取不到。
每一个学生的成绩和姓名放在一起,按照成绩排序后,就可以得到这个学生的名字。
存储成绩 — float 类型
存储名字 – 字符串 – 字符数组类


一、结构体是什么?

  结构体就是用来存储不同数据类型的数据,将某一个物体的属性抽离出来,保存在一起形成一个整体。
  将学生主体里面的成绩和姓名属性抽离出来,放在一起形成一个学生的整体。

二、结构体类型

1.声明结构体类型

是一种自定义数据类型。
  结构体关键字:struct
  结构体起个名字:自定义 Student
  属性需要使用{}
  {}里面的语法: 属性类型 属性名; 属性名自定义

struct Student
{
	//成绩 -- float 类型
	float score;
	//姓名 -- 字符数组类型
	char names[21];
};

数据类型的名字:struct Student   类似于 int float char

2.结构体变量

数据类型是规定空间多大。
开空间 – 定义变量。 数据类型 变量名
数据类型:struct Student

代码如下(示例):

	struct Student s1;
	//开空间的时候会按照里面属性的顺序进行分配空间。
	//通过变量定位到属性,可以采用 点语法 结构体变量.属性名
	//s1.score
	scanf("%f",&s1.score);
	//s1.names
	scanf("%s",s1.names);

3.容易混淆的概念

3.1给类型起个别名

1、先定义在起别名:
typedef 数据类型 别名;

	typedef struct Student student;
	//直接使用别名定义变量
	student s1;

2、在定义结构体的时候直接起别名。

	//第一种方法
	typedef struct Student
	{
		float score;
		char names[21];
	}student;
	//第二种方法
	typedef struct
	{
		float score;
		char names[21];
	}student;

3.2在定义结构体的时候直接定义结构体变量或者结构体指针,结构体数组

	typedef struct Student
	{
		float score;
		char names[21];
	}s1,s2;		//s1、s2是结构体变量

总结:有 typedef{}后面就是类型名称,不加 typedef{}后面就

4.结构体成员在内存中分布

结构体属性在内存是按照结构体定义的顺序进行分配空间。
分配的时候遵循字节对齐的原则。
字节对齐:
  首先找到占用字节数最大的成员,以这个成员所占字节为单位进行分配空间。
  成员首地址距离结构体变量的首地址必须保证是成员所占字节数的正数倍。

struct test1
{
	int a; // 4
	float b; // 4
	short c; // 2
}
//发现占用空间数最多的是 4,那么分配空间的时候就是以 4 为单位进行分配
printf("%d",sizeof(struct test1)); // 12

struct test2
{
	char a; // 1
	short b; // 2
	int c; //4
};
printf("%d",sizeof(struct test2)); // 8

在这里插入图片描述

5.结构体变量初始化

定义变量就给值。

代码如下(示例):

	struct Student s1 = {720,"lili"};
	printf("%f %s",s1.score,s1.names);

6.结构体数组

6.1结构体数组定义

数组:元素数据类型 数组名[元素个数]

代码如下(示例):

	struct Student
	{
		float score;
		char names[21];
	};
	struct Student arr[3];
	//第一个结构体 :arr[0] -- arr[0].score arr[0].names
	//第二个结构体: arr[1]
	//第三个结构体: arr[2]
	arr[0].score = 650;	
	// *(arr[0].names) -- char 空间 arr[0].names[0]	就一个char
	strcpy(arr[0].names,"小明");
	printf("%f %s",arr[0].score,arr[0].names);

6.2结构体数组初始化

代码如下(示例):

	struct Student arr[3] = {{650,"小明"},{530,"小白"},{620,"小兰"}};
	
	int i;
	for(i=0;i<3;i++)
	{
	printf("%f %s\n",arr[i].score,arr[i].names);
	}
//怎么获取结构体数组的长度? sizeof(arr) / sizeof(struct

7.结构体指针

指针:指向对象的数据类型 *指针名
通过结构体指针操作 指向的结构体成员可以用 -> 成员访问符号

struct Student s1 = {560,“小白”};
struct Student *p;
	p = &s1
//通过结构体指针操作 指向的结构体成员可以用 -> 成员访问符号
printf("%f %s",p->score,p->names);
scanf("%f %s",&p->score,p->names);

结构体指针指向— 动态申请的地址

struct Student *p = (struct Student *)malloc(sizeof(struct Student))

8.注意点

1、结构体变量除了初始化之外,不能整体赋值
2、可以整体拷贝。
在这里插入图片描述
在这里插入图片描述

两个结构体变量交换值。
代码如下(示例):

#include<stdio.h>
struct Student
{
	float score;
	char names[21];
};
int main()
{
	struct Student s1 = {720,"小白"};
	struct Student s2 = {530,"小兰"}
	struct Student temp;
	temp = s1;
	s1 = s2;
	s2 = temp;
	printf("%f %s\n",s1.score,s1.names);
	printf("%f %s\n",s2.score,s2.names);
	return 0;
}

总结

  结构体就是用来存储不同数据类型的数据,将某一个物体的属性抽离出来,保存在一起形成一个整体。
  是一种自定义数据类型。
  结构体关键字:struct
  结构体起个名字:自定义 Student
  属性需要使用{}
  {}里面的语法: 属性类型 属性名; 属性名自定义
取别名

//第一种方法
typedef struct Student
{
  float score;
  char names[21];
}student;
//第二种方法
typedef struct
{
  float score;
  char names[21];
}student;

直接定义结构体变量

	typedef struct Student
	{
		float score;
		char names[21];
	}s1,s2;		//s1、s2是结构体变量

结构体属性在内存是按照结构体定义的顺序进行分配空间。
结构体变量除了初始化之外,不能整体赋值。
可以整体拷贝。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值