C语言——自定义类型(结构体、枚举、联合)

本文深入探讨了C语言中的自定义类型,包括结构体的声明、匿名结构体及其常见错误,结构体成员的访问方式,结构体初始化和内存对齐,以及枚举和联合的定义、特点和使用场景。结构体中的位段和枚举在节省空间和提高代码可读性方面具有显著优势。同时,文章也提醒开发者注意结构体在传参和内存分配时可能遇到的问题。
摘要由CSDN通过智能技术生成

前言

C语言里自定义类型有3种,分别是结构体,枚举,联合

结构体

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

结构体的声明

结构体的声明形式如下

struct tag//tag是标签名
{
   
 member-list;//大括号里面是结构体成员
}variable-list;//大括号后面分号前是变量列表,可以在这里定义变量。注意最后的分号不能少

示例

struct Book
{
   
	char name[30];
	double price;
	char author[30];
}book1;

在上面的例子中,Book是结构体标签,在这段代码之后我们可以用如下的命令来创建这种类型的结构体变量

struct Book book2;//struct Book是结构体类型,book2是结构体变量

匿名结构体

结构体的标签名是可以省略的,但这样这种结构体就只能在大括号后面直接定义变量。
示例

struct
{
   
 int a;
 char b;
 float c;
}x;
struct
{
   
 int a;
 char b;
 float c;
}a[20], *p;//这里a是结构体数组,p是结构体指针

由于匿名结构体没有标签,我们无法像前面的例子一样用

struct+标签+变量名;

这样的方式创建变量,所以我们一般不用匿名结构体。

使用结构体时的两个易错点

易错点1

这里再举一个关于匿名结构体的错误示范

struct 
{
   
	int a;
	char b;
	double c;
}s;
struct 
{
   
	int a;
	char b;
	double c;
}*ps;
ps=&s;

这样的代码是有问题的,看起来ps指向的类型和s的类型是同一种类型,但是编译器会把他们认为是两种不同的结构体类型,虽然会得出想要的结果,但是编译器会提出警告。
在这里插入图片描述

易错点2

结构体声明知识创建了一种类型,并没有实际分配空间。

#include<stdio.h>
#include<string.h>
struct BOOK
{
   
	float price;
	char name[30];
}*ps;
int main()
{
   
	ps->price = 88.9f;
	//ps->name = "C primer plus";//注意字符串拷贝不能用等号!
	strcpy(ps->name, "C primer plus");
	printf("%f\n", ps->price);
	printf("%s\n", ps->name);
	return 0;
}

大家可以自行尝试运行如上代码,程序会挂掉
在这里插入图片描述

正确的写法应该是下面这样

#include<stdio.h>
#include<string.h>
struct BOOK
{
   
	float price;
	char name[30];
}*ps,s;
int main()
{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值