C语言构造类型的学习

1. 结构体

(1)概念:
1)结构体就是存放不同类型数据的集合;
2)结构体内部可以放入数组;
3)结构体内部可以放入结构体。
___________________________________________________________
(2)结构体定义的代码示例:

struct Person
{
	int number;
	char sex;
	double money;
};
struct Person p1;//struct Person是类型;p1才是结构体变量。

//结构体初始化
struct Person example_person = {1001,'m',10000};
//可以给部分成员进行初始化(会按照定义的先后顺序进行匹配,而不是按照变量类型匹配)。

___________________________________________________________
(3)结构体别名处理

//此时定义的P是一个全局变量。
struct Person
{
	int number;
	char sex;
	double money;
}P;

//此时定义的P是一个变量类型。
typedef struct Person
{
	int number;
	char sex;
	double money;
}P;

___________________________________________________________
(4)结构体字节对齐与位域
结构体所占的内存大小与以下两点有关:
1)本身的成员变量类型;
2)结构体存在字节对齐,如果下一个成员无法在有限空间存放,则需要额外的空间存放;
3)结构体所占内存大小特点:结构体内部最大的单成员类型的整数倍。


改变优化字节对齐的方法有两种:
1)按照有限空间合理排序成员顺序;

#include <stdio.h> 
typedef struct
{
	int number;
    double money;
	char sex;
}P1;
typedef struct
{
	int number;
    char sex;
	double money;
}P2;
int main(int argc, char** argv) 
{
    P1 p1;
    P2 p2;
    printf("p1:%ld\r\n",sizeof(p1));
    printf("p2:%ld\r\n",sizeof(p2));
    return 0; 
}

在这里插入图片描述
可以看到,结构体类型P1和P2内定义的变量都一样,只是排序不同,但是它们所占的内存空间会不相同。
定义结构体时,尽量把占内存空间小的变量放在一起,凑出来的空间小于等于占内存空间最大的变量。


2)更改字节对齐的方式。

#include <stdio.h> 
#pragma pack(1) 
typedef struct
{
	int number;
    double money;
	char sex;
}P1;
typedef struct
{
	int number;
    char sex;
	double money;
}P2;
int main(int argc, char** argv) 
{
    P1 p1;
    P2 p2;
    printf("p1:%ld\r\n",sizeof(p1));
    printf("p2:%ld\r\n",sizeof(p2));
    return 0; 
}

在这里插入图片描述
字节对齐按照1字节对齐,无额外空间的方式,直接等于偶有成员的字节相加。


3)位域,还是优化结构体占内存的方式。

int number:1;
char sex:1;
double money:1;
//针对于整数类型的成员变量,可以通过位域制定其所占内存位的多少。
//位域无法超过其类型本身的位数,如char不能超过8位。

___________________________________________________________
(5)结构体使用的注意事项
1)不允许结构体内嵌自己结构体类型的变量,系统无法确定到底需要创建多大的内存。
2)结构体可以定义在函数内部,但非结构体定义的函数内部,无法在外部进行访问,即如果结构体定义在函数内部,无法在外部获取其定义,只能在外部重新定义结构体。
3)需要保证结构体的定义是在使用之前处理。
___________________________________________________________

2. 共用体

共用体的定义代码示例:

union Message
{
	int number;
	char sex;
	double money;
	int result[10];
};

(1)共用体的内存大小只和最大的元素大小有关。
(2)共用体大部分的操作和结构体一样。
1)对于共用体,其只有一个内存,不可以按照结构体初始化的方式对所有成员变量进行初始化,其初始化只需要对其中某一成员进行初始化;
2)共用体依然可以使用字节对齐;
3)共用体依然可以使用位域。

___________________________________________________________

3. 枚举

枚举的定义代码示例:

enum Weekday
{
	Monday;
	Tuesday;
	Wednesday;
	Thursday;
	Firday;
	Saturday;
	Sunday;
};

(1)枚举是一个类型,其本质还是正整数类型。
(2)可以为枚举的元素制定其值为多少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值