【学习生涯】结构体基础

本文详细介绍了C语言中的结构体、位段、共用体和枚举类型。结构体用于组合多种数据类型形成新的数据结构;位段节省内存,用于嵌入式和网络数据传输;共用体则允许多个变量共享同一块内存;枚举提供了一种定义符号整型常量的方式。文章还讨论了结构体内存对齐的原则,并通过实例展示了各种类型的使用和内存占用情况。
摘要由CSDN通过智能技术生成

什么是结构体

结构体其实就是一个数据,这个数据是由多个不同数据类型组成的数据

创建结构体

struct  结构体名
{
  //数据成员
  char name[20];
  int age;
  int num;
};
//一般结构体是描述一类事物的共同属性(抽象具有公有的特征)
//一般结构体描述一类事物
//结构体类型: struct 结构体名  
//struct 结构名等效int 也就是一个数据类型
//C语言的创建变量语法
//类型  变量名;
  • 学会创建结构体类型
  • 知道结构体类型怎么表达式
  • 学会创建结构体变量
  • 结构体变量创建并且初始化
    • 用{}的数据去初始化
    • {}中的数据类型一次要和定义的顺序类型一致

如何访问结构体中的数据

结构体中成员必须要通过结构体变量去访问

  • 结构体数组算是多个普通的结构体变量集合
  • 结构体指针:指针必须指向了结构体变量
    • 变量访问: 变量名.成员访问
    • 指针访问: 结构体指针->成员访问
    • 在操作结构体中的成员,不需要看前缀,只需要看成员,以前这种数据是怎么操作,现在就怎么操作

创建位段

struct 结构体名
{
  	类型 变量名:数字;
    //......
};

位段的理解

  • 数据存储的内存精确到二进制位
  • 节省内存
    • 嵌入式操作一些特殊器材
    • 网络传送特殊数据
#include <stdio.h>
#include <stdlib.h>
struct Flag 
{
	unsigned char a : 3;	//000-111  7   
	unsigned char b : 1;	//0-1
	unsigned char c : 3;	//000-111
};
int main() 
{
	struct Flag flag = { 8,1,7 };  //1000
	printf("%u\t%u\t%u\n", flag.a, flag.b, flag.c);
	printf("%p\n", &flag);
	printf("%zd\n", sizeof(flag));
	return 0;
}

C语言共用体

联合体也叫做共用体

共用体定义

union 名字
{
  //数据成员  
};

共用体的理解

  • 所有变量使用的内存都是同一块内存,一般是共用体中数据成员占用内存最多的变量内存
  • 共用体在使用时候只有一个变量有效,对于初始化不能同时初始化所有变量
#include <stdio.h>
#include <stdlib.h>
union Data 
{
	int num;
	char name[20];
};
int main() 
{
	//union Data data = { 1,"name" };  //错误写法
	union Data data;
	data.num = 65;
	printf("%s\n", data.name);
	printf("sizeof:%d\n", sizeof(union Data));
	strcpy_s(data.name, 20, "ABCDEF");
	printf("%d\n", data.num);
	return 0;
}

C语言枚举类型

枚举类型它是符号整形常量,通常使用枚举类型使用表示一些列具有特殊含义的整数(幻数)

枚举类型的定义

enum 名字{Left,Right,Down,Up};

枚举类型的理解

  • 是个整形常量
  • 初始化问题
    • 默认初始化
    • 赋值的初始化
    • 默认和赋值的初始化

C语言结构体内存对齐

  • 字符可以拆分
  • 字符可以和整形变量合并
  • 习惯写代码的方式: 一般尽量把大的内存放到后面写
#include <stdio.h>
struct MM 
{
	char name[20];   //20   16+4
	int age;		 //4    4+上面的:4
	double score;	 //8    8
};
struct Boy 
{
	char name[20];   //20  16 +4 补4
	double score;	 //8
	int age;		 //4  补4
};

struct Girl 
{
	char name[5];
	int age;
};

struct Data 
{
	struct Girl girl;	//12
	struct Boy boy;		//40
	double info;
	struct MM mm;		//32
};


struct Test
{
	struct Girl girl;	//12
	double info;
	struct Boy boy;		//40
	struct MM mm;		//32
};
union UData 
{
	char name[19];
	double num;
	int age;
};
struct Test2
{
	struct Girl girl;	//12
	double info;
	struct Boy boy;		//40
	struct MM mm;		//32
	union UData data;	//24
};
int main() 
{
	printf("%zd\n", sizeof(struct MM));
	printf("%zd\n", sizeof(struct Boy));
	printf("%zd\n", sizeof(struct Girl));
	printf("%zd\n", sizeof(struct Data));
	printf("%zd\n", sizeof(struct Test));
	printf("%zd\n", sizeof(union UData));
	printf("%zd\n", sizeof(struct Test2));
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值