構造知識についてのあなたの理解を簡単に話してください
注: 作成者が使用している IDE は Microsoft Visual Studio 2022 (64 ビット プラットフォーム) です。
1.はじめに
そもそもなぜ構造が必要なのでしょうか?
回答: 複雑なことを表現するためですが、名前、年齢、性別、電話番号、自宅の住所などの個人情報など、通常の基本型では実際の要件を満たすことができません。一括して入力したい場合は、比較してください。単一の変数(構造(本体内ではメンバーと呼ばれ、将来はメンバーに置き換わる)を持つ)は管理が困難です。これらすべてのメンバーを全体に組織化するには、まず、内部の各メンバーが構造の役割を果たします。次に、構造上、社内のさまざまなメンバーを訪問することで、より読みやすくなります。
構造とは何ですか?
回答: 新しいデータ タイプは、いくつかの基本的なデータ タイプを組み合わせて形成されます。
2. 構造タイプ1の作成
2.1 一般的な説明
従業員の説明などのコードに直接移動します
struct employee//结构体类型名
{
char name[10];//姓名
int age;//年龄
char sex[10];//性别
char phone[20];//电话号码
}e1//结构体变量名称;
2.2 特別な声明
それともコードに直接アクセスしますか?
struct //匿名结构体
{
char name[10];//姓名
int age;//年龄
char sex[10];//性别
char phone[20];//电话号码
}e1//结构体变量名称;
この種の匿名構造体タイプは、構造体タイプの名前が変更されない場合は 1 回だけ使用できます。
2.3 構造の自己参照
typedef struct Node
{
int data;
struct Node* next;
}Node;
構造が自己参照である必要がある場合は、匿名構造を定義しないでください。
3. 構造体の初期化とアクセス
3.1 構造体の初期化
コードを直接アップロードする
#include <stdio.h>
struct employee
{
char name[10];
int age;
char sex[10];
char phone[20];
}e1;
int main()
{
struct employee e1 = {
"wangwu",18,"male","12312312312" };//初始化
return 0;
}
3.2 構造体のメンバーへのアクセス
结构体变量.成员变量名
结构体指针—>成员变量名
例
#include <stdio.h>
struct employee
{
char name[10];
int age;
char sex[10];
char phone[20];
}e1;
int main()
{
struct employee e1 = {
"wangwu",18,"male","12312312312" };
e1.age = 20;
printf("%d \n", e1.age);
struct employee* e2 = &e1;//定义结构体指针并赋值
e2->age = 25;//结构体指针访问成员
printf("%d \n", e1.age);
printf("%d \n", e2->age);
return 0;
}
4. 構造メモリの調整
4.1 構造サイズ
コードから始めましょう
#include <stdio.h>
struct employee
{
char name[4];
int age;
char sex[5];
char phone[4];
}e1;
int main()
{
printf("%d \n", sizeof(e1));
return 0;
}
従業員数の計算を実行すると、20 と表示されます。構造体のサイズを文字通り計算すると、名前(4)+年齢(4)+性別(5)+電話番号(4)=17バイトとなるはずです。したがって、構造サイズの計算は、私たちが通常理解している計算ではありません。
4.2 メモリの調整
まず、構造1の配置規則をマスターする必要があります。
1.结构体的第⼀个成员对⻬到相对结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。
- VS中默认的值为8
-Linux中没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍
要約すると、従業員の規模を再計算します。
#include <stdio.h>
//VS默认对齐数为8
struct employee
{
char name[4];//4个字节 开辟空间占位0~3
int age; //4个字节 开辟空间占位4~7
char sex[5]; //5个字节 开辟空间占位8~12
char phone[4];//4个字节 开辟空间占位13~16
//一共占位0-16个字节,共17个字节。而最大对齐数为4跟8较小的数,就是4。
//所以结构体整体大小就是4的整数倍也就是20
}e1;
int main()
{
printf("%d \n", sizeof(e1));
return 0;
}
4.3 メモリアライメントの重要性1
1. 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定
类型的数据,否则抛出硬件异常。
2. 性能原因:
数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于,为了访问未对⻬的内存,处理器需要
作两次内存访问;⽽对⻬的内存访问仅需要⼀次访问。假设⼀个处理器总是从内存中取8个字节,则地
址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数,那么就可以
⽤⼀个内存操作来读或者写值了。否则,我们可能需要执⾏两次内存访问,因为对象可能被分放在两
个8字节内存块中。
总体来说:结构体的内存对⻬是拿空间来换取时间的做法