自定义类型详解:结构体、枚举、联合体

结构体

定义:一些不同类型变量的集合。
数组:相同类型元素的集合。

结构体声明

struct tag//sturct 结构体关键字
{
	member - list;//结构体成员
}varible-list;//变量列表

代码实操:

struct  stu
{
	char name[20];
	char tele[12];
	char sex[10];
	int age;
}s4,s5,s6;//全局变量

struct stu s3;//全局变量

int main()
{
	struct stu s1;//局部结构体变量
    struct stu s2;//局部结构体变量
	return 0;
}

 匿名结构体类型

struct //sturct 结构体关键字
{
	member - list;//结构体成员
}varible-list;//变量列表

结构体自引用

struct node
{
	int data;
	struct node* next;
};

对结构体类型重命名

typedef struct node
{
	int data;
	struct node* next;
}nod;//把原先node的结构体重新命名为nod


int main()
{
	struct node n1;
	nod n2;//两种方式都可以定义
	return 0;
}

结构体变量的定义和初始化

struct s
{
	char c;
	int a;
	double d;
	char arr[20];
};

int main()
{
	struct s s = { 'c',100,3.14,"hello" };
	printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
	return 0;
}

如果结构体中包含结构体

struct t
{
	double b;
	int age;
};

struct s
{
	char c;
	struct t st;
	int a;
};

使用时应该是:

struct s s={'c',{55.6,30},100};

结构体内存对齐

结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

修改默认对齐数

# progma pack(4)//修改默认对齐数为4

#progma pack()//取消设置过的默认对齐数

offsetof(宏)

计算结构体成员相对于结构体开头的字节偏移量

struct s
{
	char c;
	int i;
	double d;
};

int main()
{
	printf("%d\n", offsetof(struct s, c));
	return 0;
}//宏的参数可以传类型

结构体传参

必须传递地址

位段

结构体实现位段
结构体的声明和结构体是类似的,但有两个不同
1.位段的成员必须是int、unsigned int或 signed int
2.位段的成员名后边有一个冒号的一个数字

//位段
struct s
{
	int a : 2;//:2表示a占了2个比特位
	int b : 5;
	int c : 10;
	int d : 30;
};

sizeof(s)//8个字节

位段的内存分配

位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的
位段存在的意义:节省空间

枚举

枚举是一种类型

enum sex
{
	//枚举的可能取值
	male,
	female,
	secret
};

int main()
{
	enum sex s = male;
	return 0;
}

给枚举常量赋值

enum sex
{
	//枚举的可能取值
	male=2,
	female=4,
	secret=8
};

enum sex s = male;
s = 5;

联合体

关键字:union
联合体也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员公用一块空间,联合变量的大小至少是最大成员的大小的整数倍。

union un
{
	int i;
	char c;
};

union un un;
un.c = 1;//赋值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值