詳細なC言語の構造体のポインタ

構造体へのポインタは、可変構造の構造体の配列を指すようにポインタおよびポインタに細分することができます。

変数の構造体へのポインタ

私たちは、変数によって、フロント構造体のメンバを参照してください「変数名構造。メンバ名」アプローチ、この方法以外にも、ポインタを使用することができます。

リコール、&​​STUDENT1は最初のアドレス、最初のエントリSTUDENT1の、すなわちアドレスSTUDENT1構造の変数を表します。ポインタ変数pの定義は、このアドレスを指すようにした場合、その後、pは可変STUDENT1部材の構造中の任意の点とすることができます。

次に、ポインタ変数は、それを入力するものとして定義されていますか?どのような構造体変数を指しているの構造の種類と構造型として定義することができ、構造の種類を定義することが必要です。構造体STUDENTような点型構造変数、ポインタ変数は、構造体の学生*型を定義しなければなりません。

以上の手順ポインタ方式を変更します:

#<stdio.hに>含ま
#インクルードは<string.hの>含ま
AGEの構造体
{ 
    ; int型の年を
    int型月; 
    int型デイ; 
}; 
STUDENTのstruct 
{ 
    char型の名前[20です]; //名前
    のint NUM; //科学号
    のstruct AGEの誕生日; //誕生日
    フロートスコア; //スコア
}; 
int型メイン(ボイド)
{ 
    学生STUDENT1構造体; STUDENT構造の構造型の定義と/ *構造体変数* STUDENT1 / 
    STUDENT構造体* P = NULL; / *ポイント構造体を定義しますポインタ変数P *のSTUDENT構造タイプ/ 
    P =&STUDENT1; / *構造変数STUDENT1に第1のアドレスのP点、すなわち、第一の部材* /のアドレス
    strcpyの((* P).nameの、 "ボブ"); / student1.nameする/(*p).name相当
    (* P)= 1989 .birthday.year; 
    。(* P)= 3 .birthday.month。
    (* P).birthday.day = 29。
    (* P).num = 1207041。
    (* P).score = 100。
    printf( "名:%sの\ nを"、(* P).nameの); //(*p).name不能写成のp 
    のprintf( "誕生日:%D-%D-%D \ n"は、(* P).birthday.year、(* P).birthday.month、(* P) .birthday.day); 
    printf( "NUM:%dは\ nを"、(* P).num)。
    printf( "スコア:%.1f \ n"は、(* p)を.score)。
    0を返します。
}

出力は次のとおりです。
名前:暁明
誕生日:1989年3月29日
NUM:1207041
スコア:100.0

、我々は、ポインタ参照を持つ変数構造体のメンバーは方法を参照してください。

(*ポインタ変数名)。メンバー名

ブラケット* Pはオペレータのメンバーであるため、省略することができないの両側に、ことに注意してください。「」優先順位ポインタ演算子上「*」、省略* Pの周りの括弧は、その後* p.numと等価であるので、もし( p.num)A。

プログラムは見ることができる:第一部材STUDENT1構造変数のアドレスへのポインタ変数p点、すなわち、第1のアドレス名文字列なので、pおよび(* P).nameのが等価であるからです。

しかし、「等価」はちょうど彼らが、メモリセルの同じアドレスを表しているが、その種類が異なっていると言うことです。(* P).nameのがchar *型であるPは、型構造体学生*のポインタ変数です。だから、strcpyのは、することはできません(* P).nameのは、pに変更しました。入力または出力%sは、パラメータの入力または出力パラメータのみを書き込むことができる場合(* P).nameのは、pが書かれていません。

また、メモリセルの同じアドレスstudent1.name&STUDENT1と表現しながら、彼らはさまざまな種類があります。書き込むことができない"P = student1.name";&STUDENT1タイプ*、pが初期化されるときのchar *がので、student1.name型であり、 "P =&STUDENT1"構造体の学生です。pは構造体STUDENT *型ですので、*型student1.name pをcharに割り当てることができません。

便宜上、またポインタ参照変数の構造部材と、使用して直感的:

(*ポインタ変数名)。メンバー名

これは、直接使用することができます。

ポインタ変数名 - >メンバ名

代わりに、彼らは同じです。「 - >」ハイメンバー演算子として、同じ構造の優先「構造部材は、オペレータ点」です。「」P-> NUM意味は次のとおりでNUM変数の構造体ポインタ変数pポイント。p型>のnum numがのメンバーの最終代わっの内容です。

その後、次の手順では、「 - >」ビットを変更しました:

#<stdio.hに>含ま
#インクルードは<string.hの>含ま
AGEの構造体
{ 
    ; int型の年を
    int型月; 
    int型デイ; 
}; 
STUDENTのstruct 
{ 
    char型の名前[20です]; //名前
    のint NUM; //科学号
    のstruct AGEの誕生日; / *構造体AGE構造体は、構造体変数の誕生日、出生* /のタイプによって定義される
    //スコア;フロートスコア
;} 
int型メイン(ボイド)
{ 
    構造体学生STUDENT1; / *構造体STUDENT構造は、タイプによって定義される構造体変数STUDENT1 * / 
    構造体STUDENT * P = NULL;ポインタ変数の/ *構造体学生定義構造タイプ* P / 
    P =&STUDENT1;最初のアドレスの/ *構造可変STUDENT1点P、すなわち、最初のアイテムのアドレス* / 
    strcpyの(P- >名前、 "ボブ"); 
    p型> birthday.year = 1989; 
    p型> = birthday.month 3。
    P-> birthday.day = 29; 
    P-> NUM = 1207041; 
    P->スコア= 100; 
    printf( "名:%sの\ nを"、P->名); // p型>名前不能写成のp 
    のprintf( "誕生日:%D-%D-%D \ n"は、P-> birthday.year、P> birthday.month、P-> birthday.day); 
    printf( "NUM:%dは\ nを"、P-> NUM); 
    printf( "スコア:%.1f \ n"は、P>得点); 
    0を返します。
}

出力は次のとおりです。
名前:暁明
誕生日:1989年3月29日
NUM:1207041
スコア:100.0

しかし、唯一の「ポインタ変数名」バック追加するにはご注意「 - >」、誕生日などのバックにメンバーの名前を追加しないでください" - >。"
要約すると、以下の3つの形式が等価です。

  • 構造体変数。メンバー名。
  • (*ポインタ変数)。メンバー名。
  • ポインタ変数 - >メンバ名。


3つの方法の最初が重要であり、多くの場合、このアプローチを使用し、他の二つの方法が多くを使用しました。一覧に戻るの話をするときにも使用するための3つの方法があります。

構造体の配列へのポインタ

配列変数の最初のアドレスへのポインタポイントは、次いで、エレメント・ポインタ・アレイがアクセスするように数値名のアレイは、ポインタ変数に割り当てることができる場合、アレイの前に話します。構造体の配列は、配列であるので、あなたは同じことを行うことができます。

私たちは、構造体の配列の各要素は構造体変数であることを知っています。あなたは構造体ポインタ変数とポインタ変数に割り当てられた構造体の配列名の配列を定義する場合、それは最初すなわち、構造体の配列の最初の要素、すなわち、構造体変数の最初のアドレスであることを意味しポインタ変数に割り当てられた構造体変数の第1の部材のアドレス。例えば:

#含める<stdio.hの> 
構造体STU 
{ 
    チャー名[20]。
    int型の年齢; 
    char型性別; 
    チャーNUM [20]。
}。
INTメイン(ボイド)
{ 
    構造体STU STU [5] = {{ "小红"、22、 'F'、 "Z1207031"}、{ "小明"、21、 'M'、 "Z1207035"}、{ "小七」、23、 'F'、 "Z1207022"}}。
    構造体STU * pを= STU。
    0を返します。
}

構造体の配列の最初の要素を指すようにポインタ変数p、即ち、点STU [0]。私たちは、ときポインタの配列へのポインタが道を移動することで、アレイの他の要素を指すことができることを知っています。

この原理はまた、最初のアドレス[1] + 1点pがSTUするために、構造体の配列および構造体へのポインタに適用されたp + 2点STUする[2] ......限り使用サイクルの最初のアドレスとして、ポインタをすることができ一つは構造配列要素を指示しました。

また、構造体の配列を構造体のポインタ変数に割り当てられていたために、その後、それらは構造の同じタイプでなければならない、ということに注意してください。

次のプログラムを書きます:

#含める<stdio.hの> 
構造体STU 
{ 
    チャー名[20]。
    int型の年齢; 
    char型性別; 
    チャーNUM [20]。
}。
INTメイン(ボイド)
{ 
    構造体STU STU [3] = {{ "小红"、22、 'F'、 "Z1207031"}、{ "小明"、21、 'M'、 "Z1207035"}、{ "小七」、23、 'F'、 "Z1207022"}}。
    構造体STU * pを= STU。
    用(; P <STU + 3; ++ P)
    { 
        のprintf( "名:%S;年齢:%D;性別:%C; NUM:%S \ n"は、P->名、P->年齢、 P->セックス、P-> NUM); 
    } 
    0を返します。
}

出力は次のとおりです。
名前:赤;年齢:22であり、性別:F .; NUM:Z1207031の
名前:ボブ;年齢:21であり、性別:M; NUM:Z1207035の
名前:小さな7;年齢:23;性別:F ; NUM: Z1207022

前に「配列とポインタとの間の通常の関係」と加え、ポインタ変数pがSTUを指すように[0]、P [0] STUと等価である、[0]、P [1 ] STUと等価である[1] ; P [2] STU [2] ......ので、[0] .nu​​mは、p [0] .nu​​m、他の共感としてSTUに書くことができると等価です。により、上記の手順のP [I]を修正します:

#含める<stdio.hの> 
構造体STU 
{ 
    チャー名[20]。
    int型の年齢; 
    char型性別; 
    チャーNUM [20]。
}。
INTメイン(ボイド)
{ 
    構造体STU STU [3] = {{ "小红"、22、 'F'、 "Z1207031"}、{ "小明"、21、 'M'、 "Z1207035"}、{ "小七」、23、 'F'、 "Z1207022"}}。
    構造体STU * pを= STU。
    int型私= 0; 
    (私は++; iが3 <)のための
    { 
        のprintf( "%S;年齢:名前%のD;性別:%のC、NUM:%のSの\ n"、P [I] .nameの、P [I]。年齢、P [i]を.sex、P [i]の.nu​​m)。
    } 
    0を返します。
}

出力は次のとおりです。
名前:赤;年齢:22であり、性別:F .; NUM:Z1207031の
名前:ボブ;年齢:21であり、性別:M; NUM:Z1207035の
名前:小さな7;年齢:23;性別:F ; NUM: Z1207022

出典:http://c.biancheng.net/view/246.html

おすすめ

転載: www.cnblogs.com/llanse-xianchengduo/p/10960498.html