结构体与共用体C语言

结构体与共用体

结构体的定义

引例

比如学生是一个整体,学生有姓名、性别、学号……我们更希望把一个事物整体的操作

自定义数据类型

  • 基础数据类型是电脑定义好了的,默认的数据类型
  • 自定义数据类型意义:需要我们采用编译器提供的已经有的最小内存操作单元,按照我们自己的业务组合而成的。所以有了结构体和共用体
    • 结构体是组合累加的概念(用的最多)
    • 共用体是共享基地址的概念

结构体的语法

  • struct结构体名== 可以认为与int等价

使用结构体要先定义再使用:创造出结构体名后,需要告诉编译器,组合方式,后面编译器看到这个类型,就知道该如何管理内存了

struct stu{
	int a1;  //成员变量
	int b2;  // 每个元素都是基础数据类型
	double c3;//然后组成了我们自定义的空间
	};

/*后续使用*/
struct stu abc;

结构体的使用

#include<stdio.h>
#include<string.h>
struct stu
{
    int age;
    char name[16];

};

int main()
{
    int a1;
    struct stu s1;
    s1.age = 10;
    strcpy(s1.name,"hello");
    printf("the student's age is %d and name is %s ",s1.age,s1.name);
}
image-20221120001340145

将上面的代码修改一下

void my_inf(const struct stu *data)
{           
    printf("the student's age is %d and name is %s ",data->age,data->name);
}

int main()
{
    int a1;
    struct stu s1;
    s1.age = 10;
    strcpy(s1.name,"hello");
    my_inf(&s1);
}

函数调用里形参是传递一个指针而不是传递一个空间,

因为你已经建立的一个结构体,你在把他传递到函数里,相当于你开辟了两个空间,这样会造成浪费空间,所以只需要把空间的地址传递给函数即可

结构体字节对齐

struct stu
{
    int age;
    char name[16];   

};
int main()
{
    struct stu s1;
  printf("sizeof=%d", sizeof(struct stu));
}

空间是一个累加的过程

image-20221120093843116

当我们把减少结构体里的char类型的空间,然而结构体所占的字节依然是20

struct stu
{
    int age;
    char name[15];

};
int main()
{
    struct stu s1;
  printf("sizeof=%d", sizeof(struct stu));
}

image-20221120094620825

结构体的空间大小

  • 结构体为了保证CPU访问效率,默认采用内存对齐机制
  • 对齐标准为结构体中基础数据类型的成员的最大值

上面int是四个字节作为一个基准而char[15]能占15个字节吗?

不行,必须是4的倍数

成员顺序有没有关系呢?

struct stu
{
    char a1;
    int age;
    short b2;
};
int main()
{
    struct stu s1;
  printf("sizeof=%d", sizeof(struct stu));
}

在这里插入图片描述

image-20221120101716996

当我们调整一下顺序

struct stu
{
    char a1;
    short a2;
    int a3;
};

image-20221120101826881

image-20221120113834228

共用体的定义

把上面的struct 换成union

image-20221120204554466

如图,共用体里面的每一个元素公用首地址

union stu
{
    char a1;
    short b2;
    int age;
};
int main()
{
    union stu s1;
  printf("sizeof=%d", sizeof(union stu));
}
image-20221120204859791
union stu
{
    char a1;
    short b2;
    int age;
};
int main()
{
    union stu s1;
    memset(&s1,0, sizeof(s1)); //初始化空间全部为0
  printf("sizeof=%d\n", sizeof(union stu));
  s1.a1='1';   //1的ASC表上对应16进制为31
  printf("the age is %x",s1.age);
}
image-20221120205440157
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tian Meng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值