『cとポインタ』ノート9-構造

2535 ワード

集約データ型は1つ以上の個別データを同時に格納することができ、Cは2つのタイプの集約データ型、配列、構造を提供する.配列は同じタイプの要素の集合であり、構造は異なるタイプの要素の集合である.
構造はスカラータイプに属するため、他のスカラータイプのように同じタイプの操作を実行できます.
構造宣言は次のとおりです.
struct tag { member-list } variable-list;

次の声明を参照してください.
struct {

    int i;

    char c;

    float f;

} x[20], *y;

以上の宣言はxとyの2つの変数を作成し、xは20の構造を含む配列であり、yはこのタイプのポインタを指すポインタである.2つの宣言は、メンバーリストが同じであっても、コンパイラによって2つの異なるタイプとして扱われます.したがってy=&xは不正である.
構造を使用する必要がある場合は、次のように宣言する必要があります.
struct name variable;

複数のソースファイルで同じタイプの構造を使用すると、煩雑に見えるためtypedefを使用して宣言構造を簡略化できます.次のようになります.
typedef struct {

    int i;

    char c;

    float f;

} Simple;

後続の声明は以下の通りです.
Simple x;

Simple x[20], *y;

このテクニックは、構造ラベルを宣言するのとほぼ同じですが、Simpleは構造署名ではなくタイプ名になりました.
ポイントオペレータを使用してメンバーにアクセスできますが、構造を指すポインタがある場合は->を使用してメンバーにアクセスします.
構造を関数に渡すと、構造がコピーされて関数に渡されます.この効率は低く、構造を指し、ポインタが関数に渡されるポインタを宣言することで、効率が向上します.
多くのマシンでは、パラメータをレジスタ変数として宣言することもでき、ポインタ伝達スキームの効率をさらに向上させることができます.
関数を構造変数に変更したくない場合は、変数にconstキーワードを使用して変更を防止できます.
異なる時点で異なるものを同じ位置に保存したい場合は、コンビネーションを使用します.結合されたすべてのメンバーは、メモリ内の同じ場所を参照します.
結合の各メンバーが異なる長さを持つ場合、結合の長さは最も長いメンバーの長さです.
連合を初期化すると、次のようになります.
union {

    int i;

    char c;

    float f;

} x = { 5 };

この初期化は常に最初のメンバーを初期化するので、他のタイプを使用して初期化すると、コンパイラはiに変換して値を割り当てます.したがって、初期化コンビネーションでは、タイプに注意してください.