C言語のカスタムタイプコーミング

C言語のカスタムタイプコーミング

ブログを長い間更新しておらず、少し錆びています。この間、ブログは停止しましたが、まだまだ勉強を続けています。本日は、C言語のカスタムタイプをご紹介したいと思います。
ここに画像の説明を挿入

構造

1.構造とは何ですか?

	在生活中,很多的复杂对象无法用C语言的某一种数据类型来描述,比如一个学生它有自己的名字,性别,年龄。这些信息我们无法用某一种基本数据类型来描述,那么我们可以用结构体将这些信息整合到一起。比如这样:
struct student
{
    
    
    char name[20];//名字
    int age;//年龄
    char sex[5];//性别
};//注意千万不能少分号

これで、構造体の宣言に成功しました。

2.構造体メンバーにアクセスするにはどうすればよいですか?

一般に、次の2つのアクセス方法があります。

1.構造体アクセス記号(。)を使用できます。メンバーアクセス演算子は、構造体変数名とアクセスする構造体メンバーの間のピリオドです。以下の例を見てみましょう。

#include <stdio.h>
#include <string.h>

struct student
{
    
    
    char name[20];
    int age;
    char sex[5];
};

int main()
{
    
    
 	struct student s1;
    strcpy(s1.name, "张三");
    s1.age = 18;
    strcpy(s1.sex, "男");
    printf("%s\t%d\t%s\n", s1.name, s1.age, s1.sex);
    return 0;
}

結果は次のとおりです
ここに画像の説明を挿入
。2。構造体への構造体ポインタを使用して、構造体メンバーにアクセスすることもできます。例は次のとおりです。

#include <stdio.h>
#include <string.h>

struct student
{
    
    
    char name[20];
    int age;
    char sex[5];
};

int main()
{
    
    
 	struct student s1;
    struct student* p = &s1;
    strcpy(p->name, "张三");
    p->age = 18;
    strcpy(p->sex, "男");
    printf("%s\t%d\t%s\n", s1.name, s1.age, s1.sex);
    return 0;
}

3.構造のサイズを計算する方法

まず、この構造を見てみましょう

struct s1
{
    
    
    char c1;
    int i;
    char c2;
};
printf("%d",sizeof(struct s1));

この構造のサイズはどのくらいだと思いますか?型のサイズを単純に追加すると、この構造のサイズは6になるはずなので、試してみましょう。結果はどうなりますか?

ここに画像の説明を挿入
ここに画像の説明を挿入

なぜ12?

インターネットで左右に検索しました。ついに問題の真相を突き止めましたが、構造物には構造アラインメント操作があることがわかりましたが、構造アラインメントとは何ですか?

つまり、構造体のメンバーがメモリに格納される場合、それらは単純に順番にまとめられるのではなく、特定のルールに従います。次に、この素​​晴らしい現象の謎を解き明かしましょう。

结构体对齐的规则:
    1,第一个成员在与结构体变量偏移量为0的地址处。
    2,其他成员变量要对齐到对齐数的整数倍的地址处。
    3,结构体总大小为最大对齐数(每个成员都有自己的对齐数)的整数倍
    4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体		   的大小就是所有最大对齐数的整数倍

まず、いくつかの用語について説明します。

オフセット:構造体メンバーのアドレスと構造体の最初のメンバーのアドレスの違いを指します。

アラインメント:コンパイラのデフォルトのアラインメント番号とメンバーのサイズの小さい方の値。

上記の構造がどのように計算されるか見てみましょう

struct s1
{
    
                 成员大小  默认对齐数(这里我用的vs默认对齐数为8)   对齐数
    char c1;   1          8                                 1
    int i;     4          8                                 4
    char c2;   1          8                                 4
};

次に、この構造体のメモリへの配置を次の図に示します。

ここに画像の説明を挿入

3番目のルールによると、構造のサイズは最大アライメント数の整数倍であるため、この構造のサイズは4の倍数であるため、12になります。

今天的知识分享就到这里了,我们下次再见,拜拜

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_60447315/article/details/123149783