C语言自定义类型浅析

C语言的自定义类型有三种:结构体、枚举、联合

一、结构体

1.定义:结构体是一些称为成员变量的值的集合,结构里的每个成员可以是不同类型的变量。

2.声明

struct tag
{
    member-list; //成员列表
}variable-list;

例如描述一个学生:

struct Stu
{
    char name[20];//名字
    int age;
    char sex[5];
    char id[20];
}s;

3.结构体成员的访问
结构体变量访问成员通过点操作符进行,点操作符接受两个操作数。
例如上面的描述学生结构体,可以用s.name等来操作。

4.结构体变量的定义和初始化

struct Stu
{
    char name[20];
    int age;
}s;
struct Stu s = {"zhangsan",20};

初始化如上述代码所示。

5.结构体内存对齐规则

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数=编译器默认的一个对齐数与该成员大小的较小值。
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 对于嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍数处,结构体的整数大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
struct S1
{
    char c1;
    int i;
    char c2;
};
//这个结构体的内存为12

二、位段

位段的声明和结构是类似的,但有两个不同:

  1. 位段的成员必须是int、unsigned int或signed int。
  2. 位段的成员名后边有一个冒号和一个数字。
  3. 位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
struct A
{
    int _a:2; //_a需要2个bit位
    int _b:5;
    int _c:10;
    int _d:30;
}

A就是一个位段类型。且占8个字节。

三、枚举和联合

枚举:

enum Color
{
    RED = 1;
    GREEN = 2;
    BULE = 4
};
enum Color clr = GREEN;
clr = 5;
  • enum是枚举类型,{ }中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值的,默认从0开始,一次递增1。并且在定义的时候也可以赋初值。

联合:

union Un
{
    char c;
    int i;
};
  • 联合是共用同一块内存空间的,这样一个联合变量的大小至少是最大成员的大小。

猜你喜欢

转载自blog.csdn.net/wandandi/article/details/80302441