结构体的定义,用法;结构体大小,字节对齐方式

一、结构体的定义,用法

结构体是一种新的数据类型,它可以包含多种不同的基本数据类型,可以更好的整合数据,多用于大小型项目中。

1.定义方法:

结构体的定义,用法;结构体大小,字节对齐方式_第1张图片

 中间的定义模式不常用(无法见名知意)

2.结构体变量初始化:

在定义变量时初始化:struct stu student = {2021,"yuanhua",17,"man"};

定义完变量后初始化:   struct stu student; student.id=2021,          

                                      gets(student.name);  student.age=17;        

                                      gets(student.sex);

结构体变量访问成员用    .

结构体指针变量访问成员用  ->

_____________________________________________________________________________

3.多个结构体嵌套:

struct address {
    char city[15];
};
struct stu {
    int id;
    char name[15];
    struct address local;
    int age;
    char sex[7];
};

 二、结构体大小,字节对齐方式:

结构体的大小并不简单是其成员字节大小之和,而是存在一种字节对齐方式。

因为cpu是以1, 2,4,8的字节块来读写内存,所以为确保结构体内数据能正确访问,对其地址作出限制,地址必须是指定对齐数的倍数,各种类型数据必须按一定规则排序。

windows平台上默认字节对齐数为8;

linux平台上默认字节对齐数为4;

字节对齐数可以通过下列方式更改

#pragma pack (4)             //括号里为要改的对齐数

需要更改对齐数的代码

#pragma pack ()               //括号里不填任何数

基本数据类型:int      float      char     double        bool       long long

结论:

1) 结构体变量的首地址,必须是 MIN{"结构体最大基本数据类型成员所占字节数", 指定对齐方式} 大小的整数倍。

2) 结构体每个成员相对于结构体首地址的偏移量,都是 MIN{当前基本数据类型成员, 指定对齐方式}大小的整数倍。

3) 结构体的总大小,为 MIN{ 结构体 “最大基本数据类型成员所占字节数”(将嵌套结构体里的基本类型也算 上,得出最大基本数据类型成员所占字节数), 指定对齐方式} 大小的整数倍。

练习:windows平台

1.默认字节对齐数:8

struct A {
    int a;
    char c;
    double b;
};

图解 :

结构体的定义,用法;结构体大小,字节对齐方式_第2张图片

得出:结构体A大小为:4+1+3+8=16 

 代码验证:

结构体的定义,用法;结构体大小,字节对齐方式_第3张图片

 2.更改字节对齐数:

#pragma pack (2)

struct A {
    int a;
    char c;
    double b;
};

#pragma pack ()

图解:

结构体的定义,用法;结构体大小,字节对齐方式_第4张图片

得出结构体A大小为:4+1+1+8=14

代码验证:

 结构体的定义,用法;结构体大小,字节对齐方式_第5张图片

3.结构体嵌套

struct address {
    char city[15];
};
struct stu {
    int id;//4
    char name[15];//15
    struct address local;//15
    int age;//4
    char sex[7];//7
};

图解:

结构体的定义,用法;结构体大小,字节对齐方式_第6张图片

得出:结构体stu大小为4+15+15+2+4+7+1=48

代码验证:

结构体的定义,用法;结构体大小,字节对齐方式_第7张图片

你可能感兴趣的:(C语言,c语言)