【C语言】C语言中的关键字struct、union、enum、typedef

一、struct

本质就是具有相同或者不同数据元素的集合

#include<stdio.h>
//定义结构体的本意就是制作类型
struct stu {
	char name[30];
	int age;
	char sex;
	int weight;
};
int main()
{
	struct stu cls[20];
	struct stu zhangsan;
}

给结构体初始化,初始化是可以整体的,但是赋值只能单个的赋值
请添加图片描述

单个赋值

#include<stdio.h>
#pragma warning(disable:4996)
struct stu {
	char name[30];
	int age;
	char sex;
	int weight;
};
int main()
{
	struct stu c;
	//c.name = "zhangsan";error//数组并不能直接赋值,需要用strcpy
	strcpy(c.name, "zhangsan");
	c.age = 18;
}

第二种赋值方法
在结构体很大时,采用该方法的效率更高,需要传参的话用该方法更好

struct stu* p = &c;
	(*p).age = 18;
	p->age = 18;
柔性数组

柔性数组是在结构体中放在最后一个元素的是数组(大小为零的一个是数组),柔性数组的使用是为了,在原始的结构体之后在开辟额外的空间,开辟的空间就是给柔性数组使用

二、union

union称为联合体操作符,union开辟的整个空间是由最大的变量决定的

union un {
	int a;
	char b;
};
int main()
{
	union un x;
	printf("%d\n",sizeof(x));

union赋值

union un {
	int a;
	char b;
	char c[20];
};
int main()
{
	union un x;
	//x.c = "zhangsan";给是数组赋值需要用strcpy
	strcpy(x.c, "zhangsan");
	x.a = 10;
	//第二种赋值的方法
	union un* p = &x;
	p->a = 10;

}

联合体的所有地址都是一样的
a和b永远在c的低地址出开辟空间

#include<stdio.h>
union un {
	int a;
	char b;
	char c[20];
};
int main()
{
	union un x;
	printf("%p\n", &x);
	printf("%p\n", &(x.b));
	printf("%p\n", &(x.c));
	return 0;
}

输出结果
请添加图片描述
联合体与大小端的关系
下面这是两种方式第一种属于小端第二种属于大端
请添加图片描述

union un {
	int a;
	char b;
};
int main()
{
	union un x;
	x.a = 1;
	if (1 == x.b)
	{
		printf("小端");
	}
	else {
		printf("大端");
	}
	return 0;
}

输出结果
请添加图片描述

三、enum

在现实当中有一大部分具有相关性的代码需要体现出来,常量名不用数字,而用英文代替有可描述性
如果常量不多的情况下,可以选择用宏,如果常量较多且具有相关性选择用enum

enum color {
	RED,
	BLUE,
	YELLOW,
	BLACK
};
int main()
{
	enum color c = RED;
	printf("%d\n", RED);
	printf("%d\n", BLUE);
	printf("%d\n", YELLOW);
	printf("%d\n", BLACK);
}

输出结果
请添加图片描述

enum color {
	RED=10,
	BLUE,
	YELLOW,
	BLACK
};
int main()
{
	enum color c = RED;
	printf("%d\n", RED);
	printf("%d\n", BLUE);
	printf("%d\n", YELLOW);
	printf("%d\n", BLACK);
}

输出结果
请添加图片描述

四、typedef

请添加图片描述
typedef定义的变量int*和直接定义的指针类型的区别
请添加图片描述
用宏定义#define定义的类型与typedef的区别
请添加图片描述
请添加图片描述

请添加图片描述
typedef 本身是一种存储类的关键字,与 auto、extern、static、register 等关键字不能出现在同一个表达式中。

typedef static int* int_;//error

最后:文章有什么不对的地方或者有什么更好的写法欢迎大家在评论区指出来。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值