1. 構造体の型の宣言
2. 構造体の初期化
3. 構造体のメンバーへのアクセス
4. 構造体のパラメータの受け渡し
はじめに: 構造体とは、メンバー変数と呼ばれる値の集合です。構造体の各メンバーは、異なる型の変数にすることができます。
1. 構造体の型の宣言
1. 構造の宣言
構造体宣言のテンプレート:
struct tag
{
member-list;
}variable-list;
これはテンプレート宣言であり、結果の構造体は int char と同じ 1 つの型だけです。
例えば、生徒の情報を記述する必要があるのですが、生徒の記述に int 型を使用できますか? 明らかにそうではありません。学生には学生番号 (char)、名前 (char)、年齢 (int)、性別 (char) が含まれるため、これは単一のタイプではなく、学生を説明するための構造が必要です。
最初の宣言方法:この構造体の完全名は次のとおりです: strcut Stu
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};//这里的分号不能丢
2 番目の方法:名前を変更する
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//给结构体类型重新取名为Stu
次のように名前を変更することもできます。
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
typedef struct Stu Stu;//重新起一行来命名
3 番目の方法:宣言時に変数を作成する
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}S1;//这里的S1是结构体创造出来的全局变量
上記の一連の操作は構造体の型を宣言しているだけであり、さらに多くの内容が続きます。
2. 構造体メンバの種類
序文:上記のテンプレートから、member_list が構造体のメンバーであることがわかります。では、構造体のメンバーにはどのような種類があるのでしょうか?
構造体のメンバーは、スカラー、配列、ポインター、またはその他の構造体にすることもできます。
struct A
{
char c;
int a;
};
struct B
{
char b;
int arr[10];
struct A c;//成员为其他结构体成员
struct A* F;//为指针类型
};
ただし、構造体メンバーはそれ自体の構造体になることはできませんが、それ自体の構造体へのポインターになる可能性があることに注意してください。
3. 構造体変数の作成と初期化
前回は宣言時に作成されるグローバル変数について紹介しましたが、次回はそれらもまとめて紹介していきます。
最初の作成方法:
#include<stdio.h>
struct Stu
{
char c;
int arr[10];
};
int main()
{
struct Stu A;//结构体变量A
struct Stu B;//结构体变量B
return 0;
}
ここで作成した変数 A と B は両方ともローカル変数です。
2番目の作成方法:
#include<stdio.h>
typedef struct Stu
{
char c;
int arr[10];
}Stu;//对结构体重命名
int main()
{
//struct Stu A;//结构体变量A
//struct Stu B;//结构体变量B
Stu C;//结构体变量C
return 0;
}
3 番目の方法:前述のグローバル変数を作成する
#include<stdio.h>
struct Stu
{
char c;
int arr[10];
}D;//全局变量D
int main()
{
//struct Stu A;//结构体变量A
//struct Stu B;//结构体变量B
//Stu C;//结构体变量C
return 0;
}
変数が作成されたら、変数を初期化します。
初期化:
#include<stdio.h>
struct Stu
{
char name[20];
int age;
double height;
};
int main()
{
struct Stu s1 = {"zhangsan",20,182.8};//顺序初始化
struct Stu s2 = {.age=18,.height=188.5};//指定成员初始化
return 0;
}
変数の作成時に初期化します。
struct Stu
{
char name[20];
int age;
double height;
}s3 = {"lisi",19,150.6};//创造的全局变量并初始化
2. 構造体メンバーへのアクセス
構造体の宣言、構造体変数の作成と初期化が完了すると、その構造体を使用できるようになります。これは、構造体のメンバーへのアクセスに関する知識です。
構造体アクセスには、「.」演算子と「->」演算子という 2 つの演算子があります。
次に、初期化と印刷の 2 つの操作による構造体メンバーへのアクセスの例を示します。
#include<stdio.h>
struct Stu
{
double height;
int age;
};
void set_s1(struct Stu* ps)//用结构体类型指针接收
{
ps->age = 22;
ps->height = 188.45;//用"->"操作符访问结构体成员
}
void print(struct Stu s)
{
printf("%d %lf",s.age,s.height);
}
int main()
{
struct Stu s1 = { 0 };//这里先初始化成0
//用一个函数对结构体变量赋值
set_s1(&s1);//因为需要修改值,所以必须要传址
//用一个函数打印结构体变量中的数据
print(s1);//只需要打印,不需要修改。传值就可以
return 0;
}
操作の結果を見てみましょう。
上記の例では演算子が 2 つありますが、どのような場合にどちらを使用するかをまとめてみましょう。(. と ->)
構造体変数 メンバ名 構造体ポインタ -> メンバ名
つまり、ポインタを使用する場合、左側は -> でなければならず、もう一方も同じです。
上記の例から、この構造体は値とアドレスの両方を渡すことができることがわかります。次に、この 2 つの違いを見てみましょう。
1.パラメータを渡す
パラメータが渡された場合、再度開く必要があるスペースが非常に大きくなり、仮パラメータは実際のパラメータのコピーであるため、値の受け渡しでは要件を満たせない場合があります。
2. アドレス指定
アドレッシングはあらゆる状況に適用でき、再度オープンする必要があるメモリは大きくないため、可能な限り構造体アドレッシングの方法を使用する必要があります。