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

结构体

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

结构体声明

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;//赋值

你可能感兴趣的