構造
1.機能:全体を使用して、収集された複数のデータを表現します(データは必ずしも同じタイプである必要はありません)。
2.構造のステートメント:
struct date { int day; int月; int年; };
- 注:
- 構造は複合データタイプであり、その中にはさまざまなタイプの変数が存在する可能性があり、変数は全体としてその中のすべての変数を表すために使用されます。
- Structはキーワードであり、その後にC言語ステートメントが続くため、最後の「;」は省略できません。
- 構造宣言の後、後続のすべての日付に3つの変数「日」、「月」、および「年」があります。
- ローカル変数と同様に、構造タイプが関数内で宣言されている場合、それは関数内でのみ使用できます。複数の関数で使用する場合は、通常、関数の外部で宣言されます。
3.宣言構造の形式
struct point { int x; int y; }; //構造を宣言する
struct point p1、p2; //変数を定義する
- 注:p1とp2にはそれぞれx値とy値があります
struct point { int x; int y; } p1、p2;
- 変数の宣言と定義を同時に行う
- (この方法は一般的ではありません)
struct { int x; int y; } p1、p2;
- p1、p2は名前のない構造であり、一般的に短期間の使用に使用されます
4.構造変数
- 次の例を見てください。今日が定義されると、今日のメモリは月、日、年の3つの部分で構成されます。
今日の構造体の日付。
today.month = 11;
today.day = 23;
today.year = 2007;
月 | 11 |
日 | 23 |
年 | 2007年 |
- 構造変数の初期化(配列と同様)
- 最初
struct date today = {07,31,2014};
//中括弧の値は、宣言で定義された変数に順番に割り当てられます。
- 二番目
struct date thismonth = {。month = 7};
//配列と同様に、初期化の数が変数の数より少ない場合、他の変数には自動的にゼロ値が割り当てられます。違いは、どの変数にどの値を割り当てるかを指定できることです。
- 構造タイプは構造変数とは異なることに注意してください。構造タイプはこのタイプの構造の内部状況を表し、構造変数は構造全体を表します。
5.構造部材
- 構造は配列に似ています。配列には多くのユニットがあり、構造には多くのメンバーがあります。違いは、構造のメンバーは異なるタイプにすることができ、配列は同じでなければならないということです。
- 配列は「[]」演算子と添え字を使用してメンバーにアクセスし、構造は「。」演算子と名前を使用してメンバーにアクセスします。
a [0] = 10;
today.day;
6.構造操作(アレイとは異なります)
- 構造全体にアクセスするには、構造変数の名前を直接使用します。
- 構造全体で、割り当てを行ったり、アドレスを取得したり、関数パラメーターに渡したりすることができます。
- 割り当てなど、アレイは次の2つの操作を実行できません。
p1 = (構造点) {5,10};
// p1.x = 5、p1.y = 10と同等;
p1 = p2;
// p1.x = p2.x、p1.y = p2.yと同等;
7.構造ポインター
- 配列とは異なり、構造変数の名前は構造変数のアドレスではありません。アドレスを取得するには、「&」演算子を使用する必要があります。
構造体の日付* pDate =&today;
8.機能パラメータとしての構造
int numberOfDays(構造体の日付d)
- 注意
- 構造全体をパラメーターの値として関数に渡すことができます。
- このとき、関数内に新しい構造変数が作成されますが、呼び出し元の構造の値がコピーされます。
- 構造を返すこともできます。
- これらのプロパティは、アレイとは完全に異なります。(配列にパラメーターが渡されるとアドレスが渡され、変更されるのはそれ自体です)
9.構造入力
- 構造全体を一度にスキャンする直接的な方法はありません。
- 入力構造の2つの方法:
1.入力関数を記述し、その中に一時構造変数を作成して、この構造を返します。
struct point inputPoint()
{ struct point temp; scanf( "%d"、&temp.x); scanf( "%d"、&temp.y); 温度を返す; }
void main()
{ 構造体ポイントy; y = inputPoint(); Outout(y); }
2.構造ポインタがパラメータとして使用され、方法が優れています。
- これには、ポインター内のメンバーへのアクセスが含まれ、ポインターが指す構造変数のメンバーを表すために、新しい記号 " -> "(矢印)が導入されます。
struct date { int month; int日; int年; } 私の一日; 構造体の日付* p =&myday;
(* p).month = 12;
p-> month = 12;
//上記の2つの式は同じ意味ですが、2番目の式の方が簡潔です。
- ポインタを使用した後、コードは次のように記述できます。
struct point * getStruct(struct point * p)
{ scanf( "%d"、&p-> x); scanf( "%d"、&p-> y); return p; } //ここではポインタ型returnが使用されます値はpを返します。トリックとして、他の関数が将来のプログラムでこのポインターを使い続けると便利です。例:int main(){ output(* getStruct(&y)); print(getStruct(&y)); }
//その他の使用法は次の
とおりです。getStruct(&y)-> x = 0;
* getStruct(&y)=(struct point){1,2};
10.構造配列
構造体日付日付[100];
構造体の日付dates [] = {{4,5,2005}、{2,4,2005}};
//配列
dates [1] .day = 20;のセルのメンバーを参照する場合
11.構造の入れ子
struct point { int x; int y; }; 構造体長方形{ 構造体ポイントpt1; 構造体ポイントpt2; };
//可変
構造長方形rがある場合;
//
r.pt1.x、r.pt1.y、r.pt2.x、r.pt2.yを持つことができます//
可変
構造長方形r、* rp;
rpを定義する場合=&r;
//次に、以下は
r.pt1.xと同等です
。rp-> pr1.x
rp-> pt1-> xがないことに注意してください(pt1はポインターではないため、->はポインターにのみ使用できます)
- ここでは、配列と構造の組み合わせを多様化して多層化することができます。たとえば、配列の単位を構造にすることができ、各構造の内部に構造があります。