自定义类型:结构体

本文介绍了结构体的基本概念,声明方式,以及特殊结构体的区别。重点讨论了自引用、枚举(提高代码可读性与类型检查)和联合(共享内存空间)的概念,并通过示例展示了它们在内存管理和大小端存储中的应用。
摘要由CSDN通过智能技术生成

结构体基础知识:

        1.概念:

        结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

        如何声明

struct tag
{
 member-list;
}variable-list;

例如如何描述一个学生

        

struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}; //分号不能丢

1.2特殊结构体的声明

struct 
{
    int age;
    int xuehao;
}st;

上面的两个结构在声明的时候省略掉了结构体标签(tag)。
那么问题来了?

下面这段代码声明的合法吗

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

1.3结构体的自引用

先来看第一种情况我们如果直接引用看看结果会怎么样

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

我在编译器试过了直接就是报错

下面是正确使用方法

        枚举:

                概念:就是把情况一一列举出来比如:星期,还有课程等等

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};
enum Color//颜色
{
 RED,
 GREEN,
 BLUE
};

比如上面中的一些情况

        初始值:从0开始也可以给他赋初始值

enum Color//颜色
{
 RED=1,
 GREEN=2,
 BLUE=4
};

        优点相较于#define

我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性

用通讯录来举例


2. 和#define定义的标识符比较枚举有类型检查,更加严谨。


3. 防止了命名污染(封装)
4. 便于调试

即使赋值给他在程序中我们可以通过调试来看到
5. 使用方便,一次可以定义多个常量

联合

概念:联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)

联合相对于结构体而言,有一个很大区别来看下面俩附图

联合;只分配一块内存空间这一块内存空间是公用的,修改一个的同时也会修改其他的,而且会以最大的那个内存为他的大小,会存在内存对齐

结构体

对其中每一块数据进行独立分块管理,修改其中一个对其他的没有影响

来看下面一个练习看看输出的结果是啥

union Un
{
 int i;
 char c;
};
union Un un;
// 下面输出的结果是一样的吗?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//下面输出的结果是什么?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);

结果是 0x55223344这个看编译器的大小端存储

正好通过此次我们可以使用联合体来看一个存储器的大小端存储模式,

int my_uinio()
{
	union 
	{
		char a;
		int b;
	}u;
	u.b = 1;
	u.a = 0;
	return u.a;
}
int main() 
{
	
	int ret = my_uinio();
	if (ret == 0) 
	{
		printf("da");
	}
	else
	{
		printf("xiao");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值