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になります。
今天的知识分享就到这里了,我们下次再见,拜拜