【C语言进阶】自定义类型

2022-04-02-

摘要

结构体

结构体类型的声明

结构的自引用

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

结构体内存对齐

结构体传参

结构体实现位段(位段的填充&可移植性)

枚举

枚举类型的定义

枚举的优点

枚举的使用

联合

联合类型的定义

联合的特点

联合大小的计算

总结

目录

结构体的声明

常规的结构的声明太过简单常见,不再过多阐述。

特殊声明

在声明结构体的时候可以不完全的声明

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

struct
{
   
	int i;
	double d;
	char c;
}arr[10], * px, x1;

注意到上面两个结构体的声明并没有标签

也就是说我们只能在声明结构体的时候创建变量,一旦声明结束,就再也找不到这个结构体的标签,自然无法使用它创建变量。

那么还要一个问题:

上面的 x1和x一样吗?

或者说下面这个代码非法吗?

px = &x;

警告:
编译器会把上面的两个声明当成完全不同的两个类型。
所以是非法的。

结构的自引用

在结构体中包含一个类型为该结构本身的成员可行吗?

//代码1
struct Node
{
   
	int data;
	struct Node next;
};
//可行否?
如果可以,那sizeof(struct Node)是多少?

显然这是不行的,它会无休止的递归下去,非法非法。

正确打开方式:

//代码2
struct Node
{
   
	int data;
	struct Node* next;
};

而结构体中包含一个自身结构体的指针就不存在这个问题了,结构体的大小是确定的,并且可以在结构体中访问和自身类型一样的结构体。

每次定义变量都要加个struct实在麻烦,我们使用typedef将代码简化一下,下面对吗?

//代码3
typedef struct
{
   
	int data;
	Node* next;
}Node;
//这样写代码,可行否?
//答案是不行的,在结构体内typedef还没有将这个类型重新定义一个名字,自然无法使用这个新类型。
//解决方案:
typedef struct Node
{
   
	int data;
	struct Node* next;
}Node;

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

有结构体的声明,那么定义一个结构体再简单不过了,就和定义普通变量一样就好。

struct Point
{
   
	int x;
	int y;
}p1; //声明类型的同时定义变量p1,p1是全局的

struct Point p2; //定义结构体变量p2,全局的

//初始化:定义变量的同时赋初值。
struct Point p3 = {
    x ,y };//类似数组初始化

struct Stu     //类型声明
{
   
	char name[15];//名字
	int age;    //年龄
};

struct Stu s = {
    "zhangsan"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值