1.構造
ガイダンス-実際の問題では、変数を変更するためにいくつかの異なるタイプの変数が必要になる場合があります。たとえば、学生の情報には、学生ID(整数)、名前(文字列)、およびグレード(浮動小数点)が必要です)待ってください、これらのデータ型は異なりますが、全体を表しています。接続がある場合は、新しいデータ型が必要です。そこで、その構造を紹介しました。
1.構造の宣言
//声明一个结构体
struct student
{
char name[20];//一个字符串表示学生姓名 ;
char num;//一个整型表示学生学号 ;
float score;//一个浮点型表示学生成绩;
};//注意分号不能少,这也相当于一条语句;
この宣言は、1つの文字配列、1つのint整数、および1つのfloat変数で構成される構造を記述しますが、実際のデータオブジェクトを作成したのではなく、このタイプのオブジェクトを構成する要素を記述していることに注意してください。 [したがって、構造と呼ばれることもあります。テンプレートの宣言。これは、データの保存方法の概要を示し、データオブジェクトをインスタンス化しないためです]。
上記の構造宣言を紹介しましょう。
- 最初にキーワードstructを使用します。これは、次が構造体であることを意味します。
- オプションのマーク(本)が続きます。これは、構造を参照するために使用されるクイックマークです。したがって、将来的にはこのようなデータオブジェクトを作成できるようになります
struct student stu;
//把stu设为一个可以使用student结构体的结构体变量,则stu这个变量就包含了其student结构体中的所有元素
- 次は、構造体メンバーのリストを囲む中括弧です。各メンバー変数は独自の宣言メソッドで記述され、記述はセミコロンで終了します。
注;各メンバーは任意のAcデータ構造体を使用できます。また可能です。 - 閉じ中括弧の後のセミコロンは、構造設計定義の終わりを示します(それ以上)。
- 構造体宣言の場所、つまりこのコードを配置する場所について。これにも範囲があります。
この種の宣言が関数の外部に配置されている場合、このファイルではオプションのマークを使用でき、宣言に続くすべての関数を使用できます。この種の宣言が関数内にある場合、そのマークは内部でのみ使用でき、宣言後にのみ使用できます。 - 構造体タイプの定義(構造体の宣言)は、コンパイラーにデータの表現方法を指示しただけですが、コンピューターにデータのスペースを割り当てることはできませんでした。構造体を使用する場合は、変数、つまり構造体変数を作成する必要があります。構造体変数を
作成します。structstduentstu;
この命令を参照してください。コンパイラーは構造体変数stuを作成し、次にコンパイラーはメモリースペースを作成します。 studntテンプレートに従って変数に割り当てられ、ここのストレージスペースはこの変数と結合されます。これは、後で構造体変数メンバーにアクセスするときにも、構造体変数名を使用してアクセスします。
構造体ブックの役割構造体宣言では、構造体の学生はintやその他の基本的なデータ型名と同じ役割を果たします。
2.構造の初期化
struct student stu={
//对结构体初始化
"xiaoming",//姓名name为字符串
1001, //学号num是整型
120.5 //成绩score为flaot型
};
//要对应起来,用逗号分隔开来,与数组初始化一样;
注目に値するのは:
-
構造体の初期化とストレージクラス期間の問題について:
静的ストレージ期間で構造体を初期化する場合、初期化項目リストの値は定数式である必要があります。ストレージ期間が自動の場合、リストの値は一定のアップである必要はありません。 -
構造変数が定義されたときに初期化されていない場合、後で一緒に初期化することはできません。
その意味は:
——————这样是可以的,在定义变量的时候就初始化了。
struct student stu={
//对结构体初始化
"xiaoming",//姓名name为字符串
1001, //学号num是整型
120.5 //成绩score为flaot型
};
——————这种就不行了,在定义变量之后,若再要对变量的成员赋值,那么只能单个赋值了。
struct student stu;
stu={
"xiaoming",
1001,
120.5
};//这样就是不行的,只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值。
——————只能
stu.name = "xiaoming"; //单个赋值;
3.構造メンバーにアクセスします
構造はスーパー配列のようなものです。このスーパー配列では、1つの要素をchar型、次の要素をflaot型、次の要素をint配列型にすることができます。これらはすべて存在します。配列では、添え字を介して配列の各要素にアクセスできます。では、構造体の各メンバーにアクセスするにはどうすればよいですか?
構造部材の演算子ドット(。)を使用します。
構造体変数名。メンバー名。
その結合性は左から右であり、すべての演算子の中で最も優先度が高いことに注意してください。
たとえば、s1.titleはs1のタイトル部分を指し、stu.nameは名前です。 stuの一部。次に、文字配列のようにs1.nameを使用し、floatデータ型のようにstu.scoreを使用できます。
stuは構造体ですが、stu.scoreはfloat型であるため、stu.scoreはfloat型の変数名と同等であり、float型に従って使用されることに注意してください。
例:printf( "%s%s \ n%f"、s1.title、s1.author、s1.value); //構造変数要素へのアクセス
注:s canf( "%d"、&s1.value);このステートメントには2つの演算子があり、&と構造体メンバーの演算子ポイントです。実際には、(s1.valueは全体であるため、つまり、s1値の部分)ですが、ポイントの優先度が&よりも高いため、同じではありません。
メンバー自体が構造タイプの場合、複数のメンバー演算子を使用して、レベルごとに最下位レベルのメンバーレベルを検索し、それを操作できます。
構造変数名。メンバー。サブメンバー......最下位レベルのサブメンバー。
全体と個別:
- 構造変数全体を同じタイプの別の構造変数に割り当てて、全体的な割り当ての効果を実現できます。このメンバー変数の値はすべて、全体として別の変数に割り当てられます。
- 構造変数全体を入出力することはできません。構造データを入出力する場合は、構造変数の各メンバーを個別に指定する必要があります。
4.構造体配列
構造体配列を参照する理由明らかに、上記の本の種類の構造では、各本を本の種類の構造変数で記述する必要があります。2つの本を記述する場合は、そのような2つの変数を使用する必要があります。 、構造体の配列はこれらの本を表すために使用されます。配列は同じタイプのデータのセットを格納するため、構造体配列の外観があります。元の設定に注意してください。
1.構造体配列を宣言します
通常の配列宣言と同様に、int a [10]; intは要素のデータ型であり、aは配列名[10]です。これは、10個のint単位がメモリに要求されることを意味します。構造体宣言を見てください; struct student stu [10];同様で、struct studentは配列要素のデータ型、stuは配列名、[10]は10個のstructstudentユニットのメモリです。
説明:ライブラリは10個の要素の特定の配列であり、各要素は学生タイプの構造を持っているため、stu [0]、stu [1] ......を取得できることを宣言します。すべてが別個の本の構造です。
ライブラリ自体は構造体名ではなく、配列名であることに注意してください。
2.構造体配列のメンバーにアクセスします
規則:構造体名の後にドット演算子を追加し、次にメンバー名を追加します。
stu [5] .name; // 5番目の要素のnameメンバーを示し、stu [5]は構造変数の名前、nameはメンバー名です;
stu [5] .name [4]; //注その名前は配列型です。5番目の配列要素の名前メンバーの4番目の文字。構造体配列のメンバーへのアクセス。
構造体へのポインターを使用する利点。配列へのポインターのように、配列自体よりも操作が簡単であり、構造体へのポインターは通常、構造体自体よりも操作が簡単です。
3.構造体ポインタを宣言して初期化します
struct student * himを宣言します。
ルールは、struct structure name + * +ポインタ名です。
この宣言は新しい構造体を作成しませんが、既存の学生タイプを指すことができるポインタ変数himpointerを作成します。構造体;
him =&stu [0];
彼が構造体stu [0]を指しているポインター、彼を使用してstu [0]のメンバーを取得する方法は?
方法1:
演算子を導入する:
構造体ポインターの後に->演算子が続くのは、構造体名の後にドット演算子が続くのと同じです。
注意すべき点の1つは、彼は構造名ではないため、彼のメンバーを使用できないことです。
方法2:
him =&stu [0]の場合、him = stu [0];&とは逆数演算子であるため;
&はアドレスを取り、*は値を取ります;
=> stu [0] .scoreは(* him)と同等です.score;括弧を使用する必要があることに注意してください。優先順位の問題です。
そうすると、すべてがhim.scoreと同じ効果があります。