構造知識についてのあなたの理解を簡単に話してください


注: 作成者が使用している 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字节内存块中。
总体来说:结构体的内存对⻬是拿空间来换取时间的做法

  1. ビット採用コースウェア「カスタマイズ型:構造」を参照↩︎ ↩︎ ↩︎

おすすめ

転載: blog.csdn.net/BlankXiangzw/article/details/133023133