C语言结构体

一.定义:

结构是一些值的集合,这些值被称为成员,同这些值的类型可以不同

二.结构的声明:

struct stu
{
int a;
char b;
};

比如用一个结构体表示出电话簿的基本信息

struct tele
{
char name;//姓名
char num;//电话号码
int i;//联系人序号
};//有分号

三.结构体的特殊声明

struct
{
char a;
int b;
}num;//将名字放在大口号后面

这种形式的结构体也是完全合法的,但是他也有自己的特点,这种结构体由于没有结构体标签(可以理解为结构体姓名),在调用时只能调用一次,同时也有需要注意的地方,如:

struct
{
char a;
int b;
}x;
struct
{
char a;
int b;
}y;

上述代码对于一下这种情况又会作何反应

x=y;

结果当然是报错,即使连个结构体外表看来一模一样但依旧不能被外表蒙蔽,在编译器严重,两个结构体依然属于类型完全不同的两个结构体。

四.结构体的自调用

之前了解过函数的自调用叫做函数的递归,那么结构体可以自己嗲用自己嘛

struct stu
{
int a;
struct stu next;
};

这种情况下的结构体自调用就是不正确的,这样会导致sizeof(struct stu next);无穷大或者无穷小,那就代表结构体不能自己调用自己嘛?当然可以

struct stu
{
int a;
struct stu * next;
};

调用的是地址就可以了

struct 
{
int a;
struct stu * next;
}stu;

那对于上述代码这种情况运行结果又会如何呢?结果依然是报错,因为上述代码在自调用时由于stu的位置,其实此时结构体并没有完全生成,那如何解决上述这种情况呢?

struct stu//在这里再加回来就好啦来
{
int a;
struct stu * next;
}stu;

五.结构体变量的创建和初始化

1.创建

struct stu a={x,y};//在创建结构体的时候就可以直接给结构体变量赋值了
struct stu//结构体类型的声明
{
int b;
int c;
};
//此时输出该结构体的结果就是
b=x;
c=y;

如果希望x的值赋给c,y的值赋给b呢,又该怎么办?

struct stu a={.b=y,.c=x};//就是通过.来指向该变量
struct stu
{
int b;
int c;
};
//此时输出该结构体的结果就是
b=y;
c=x;

.六结构体内存对齐

什么叫结构体的内存对齐?
结构体的第一个元素与结构体首位置偏移量为0处对齐,同时其他元素要满足所对齐的偏移量都是某个整数的倍数
如果在嵌套结构体的情况下对齐的数就是嵌套元素及其本身元素中大小最大的那个整数大小为公约数。
例如

struct a
{
char b;
char c;
int d
};
printf("%d\n",sizeof(struct a));
struct e
{
char b;
char d;
int c
};
printf("%d\n",sizeof(struct e));
//输出结果
//a=8
//b=12

你造成上述结果的原因是什么呢?
在这里插入图片描述

如图蓝色为被浪费的内存
如图上所画,蓝色是被浪费的空间,而s1占8个内存,s2占12的内存又是什么造成的,首先char 的大小为1个字节,而int 的大小为四个字节,根据结构体中每个元素的偏移量应该为结构体元素最大体积的倍数,换算成本题也就是,在“某种情况下”,元素能占用的内存必须是int 大小的倍数,那“某种情况”又是怎么一回事?
很简单结构体的存储当然也需要考虑读取时的难易程度,如果不像上述一般有空间浪费掉那在读取时就会有以下这种情况:
在这里插入图片描述
如图,如果不浪费些内存那么在查询时就会非常的混乱,在第一次与第二次的查询中,元素的类型也都很杂乱,这就体现出来了偏移值和结构体元素为什么要保证在某个整数的倍数上了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值