自定义类型c语言

1.结构体

2.枚举

3.联合

结构体

        结构体是由不同类型或相同类型的成员组成的结合,定义形式为:

struct Name
{
   成员;
}
例:
struct Stu
{
    char name[20];
    int age;
    float score;
    char other[20];
}

      struct stu为自定义结构体类型,s1为结构体变量,初始化与其他类型的变量相同,访问结构体成员使用.(成员访问运算符),方式为结构体变量.结构体成员。

#include<stdio.h>
struct stu
{
	char name[20];
	int age;
	float score;
	char other[20];
};
int main()
{
	struct stu s1 = { "张三",22,95.5f,"无" };
	printf("%s %d %f %s", s1.name, s1.age, s1.score, s1.other);
	return 0;
}

运算结果如下:

 

 结构体大小的计算:

         如要计算结构体的大小,就先要了解结构体对齐。1.首先结构体的第一个成员永远都位于0偏移处;2.其次从第二个成员开始,以后的每个成员都要对齐到对齐数的整数倍(对齐数:成员自身大小和默认对齐数的极小值。如:vs环境下默认对齐数是8,gcc环境无默认对齐数,则为成员自身大小);3.当成员全部存放进去后,结构体的总大小必须是所有成员的对齐数中最大对齐数的整数倍,如果不够,则浪费空间对齐;4.如果结构体里嵌套了结构体,嵌套的结构体对齐到自己成员最大对齐数的整数倍,结构体整体大小就是所有最大对齐数(包括嵌套结构体的对齐数)的整数倍。

       这里介绍一个函数offsetof(结构体类型,成员名),计算偏移量。#pragma pack(数字) 修改默认对齐数,还原可令数字为空。

struct S1
{
	int a;
	char c;
}s1;
struct S2
{
	double d;
	char c;
	int i;
}s2;
struct S3
{
	char c;
	struct S2 s2;
	double d;
}s3;
int main()
{
	printf("%d\n%d\n", sizeof(s1), sizeof(s3));
	return 0;
}

s1变量在内存中的存放如图解析:

 

 s3变量在内存中的存放如图解析:

c      0空  4s2   8s2  12s2  16s2  20d  24d  28

空    1

空  5s2   9s2  13s2  17s2  21d  25d  29
空    2空  6  s2   10s2   14s2  18s2  22d  26d  30
空    3空  7s2    11s2   15s2  19s1  23d  27d  31

枚举

定义格式为:enum Name {枚举的可能取值},第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。

enum Sex
{
  MALE,
  FEMALE,
  SECRET
}
enum Sex zhangsan=MALE;

联合

       联合与结构体定义方式相同,但是其的每一个成员都共用一块空间,所以一旦修改任意一个成员就会改变其他成员。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sakura&NANA

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

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

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

打赏作者

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

抵扣说明:

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

余额充值