C言語のカスタムデータタイプの構造体、列挙と連携の詳細


構造体基礎知識
まず構造体の出現はC言語を使う基本的なタイプが私達の需要を満たすことができないからです。例えば、本の名前、著者、価格、出版社などの一連の属性が必要です。C言語の基本的なデータの種類が解決できなくて、一番重要なカスタムデータの種類、構造体が現れました。
まず、本の構造体のタイプを作成して認識します。

struct Book
{
	char name[20];
	char author[20];
	int price;
};
まずstructは構造体のキーワードで、コンパイラに教えます。ここで宣言しているのは他のものではなく構造体のタイプです。そしてBookは構造体のラベルです。キーワードとラベルはあなたの構造体のタイプの名前です。つまりstruct Bookは構造体のタイプの名前です。二つの文字配列と一つの型変数があります。一つの配列は本の名前を保存するために用いられます。一つの配列は本の著者を保存するために用いられます。型の変数は本の価格を保存するために用いられます。型の宣言ではどれだけの変数を必要としますか?注意してください。構造体声明の末尾の番号は省略してはいけません。ここでは基本的な認識ができました。次に構造体の種類を使ってみます。タイプである以上、必ず変数を作成します。上の説明書の構造体のタイプを使ってみます。

使用規則と基本データタイプなどは大差がないと見られますが、唯一の違いは構造体初期化には必ず大括弧で初期化の内容をまとめなければなりません。初期化ではないなら、先に彼のメンバーに訪問しなければなりません。ここでは構造体を作る時に初期化して、いくつかのデータを入れました。これらのデータが画面上で出力されているのがよく分かります。構造体変数を通じて構造体メンバーにアクセスする時に使用しました。この点は構造体メンバーが操作子にアクセスするので、構造体のメンバーを通して入手できます。見終わったら、仲間たちも自分でノックしてみてください。コード能力は鍛えられています。初学の時は必ず多くノックして練習してください。この構造体の基礎知識を紹介しました。
構造体のステップ知識
まず、構造体は入れ子で定義できます。次のように。



構造体の計算サイズ
構造体はメモリを割り当てる時、構造体のメモリ配置が発生します。
  • 最初のメンバは、構造体変数とのオフセット量が0のアドレスにある。
  • 他のメンバー変数は、ある数字の整数倍のアドレスに配置されます。
  • 構造体の総サイズは最大配置数(各メンバ変数に1つの配置数がある)の整数倍である。
  • 構造体がネストされている場合、ネストされた構造体が自分の最大配置数の整数倍に揃えば、構造体の全体サイズはすべての最大配置数(ネスト構造体の配置数を含む)の整数倍となります。

  • ルールを知っています。下のこの構造体の大きさを考慮しないと、6 byteの空間だけですべてのデータを保存できますが、メモリの配置を考慮すると12 byteの空間が必要です。これは十分に1倍の空間が必要です。なぜこの配置の規則が必要なのですか?
  • プラットフォームの原因(移植の原因):すべてのハードウェアプラットフォームが任意のアドレス上の任意のデータにアクセスできるわけではない。いくつかのハードウェアプラットフォームは、特定のタイプのデータを特定のアドレスでのみ取り出すことができます。
  • パフォーマンス要因:データ構造(特にスタック)は、できるだけ自然境界上に配置されるべきである。原因は、配置されていないメモリにアクセスするために、プロセッサはメモリアクセスを2回行う必要があるからです。配置されたメモリへのアクセスは一回だけ必要です。
  • 
    struct S1
    {
     char c1;//1 byte
     int i;//4byte
     char c2;//1byte
    };
    printf("%d
    ", sizeof(struct S1));

    総じて言えば、構造体のメモリ配置は空間を持って時間と交換する方法で、構造体は紹介したのと同じです。以下、列挙を見てみます。
    列挙の基礎知識
    列挙はその名の通り、可能性をすべて列挙しています。例えば、一週間は月曜日、火曜日から日曜日までの7日間は列挙が使えます。
    
    enum Day
    {
     Mon,
     Tues,
     Wed,
     Thur,
     Fri,
     Sat,
     Sun
    };
    
    構造体と同じで、まずエニュメレート・キーワードenmu、そしてエニュメレート・タグDayであるが、構造体とは異なり、エニュメレート・メンバーは定数であり、しかも整数定数であり、値を与えない場合はデフォルト値があり、そしてデフォルト値は下から順に1ずつ増加することが分かります。

    非アクティブな割り当てが見られます。次は前より1つ大きいです。そして最初のデフォルトは0です。

    列挙はこのように簡単で、次に連合体を見てみます。
    連合体
    共同体はキーワードunionとラベルで定義されています。構造体と列挙は同じ定義方式です。前の二つとは違って、一つの連結体は一つのメモリ空間しかないです。この言葉はどういう意味ですか?最大の変数だけを開発するメモリに相当します。他の変数は全部その変数が空間を占めています。下の写真を見てください。



    上の黒い部分と赤い重複部分は共用のエリアです。二つの変数は全部使えます。これはあまり使わないものです。唯一覚えているのは、連合体は現在のコンパイル環境が大端バイト順記憶モードかそれとも小端バイト順記憶モードかを求められます。どうやって求めたらいいですか?
    
    #include<stdio.h>
    union Un{
    	char ch;
    	int n;
    };
    int main()
    {
    	union Un un;
    	un.n = 1;
    	//   01 00 00 00
    	//   00 00 00 01
    	if (un.ch == 1) {//            
    		printf("  ");
    	}
    	else {
    		printf("  ");
    	}
    	return 0;
    }
    
    これは理解できなくても大丈夫です。普通は使えません。
    いくつかの結びと提案
    1.できるだけ共同体を使わないでください。一回の修正で複数のデータが修正され、予測できない問題が発生しやすいです。
    2.構造体のメモリがそろっているので、必ず計算を覚えてください。実際には使えないかもしれませんが、面接に出るかもしれません。
    3.構造体の中にフィールドという知識点があります。形式は以下の通りです。これは現在データを転送するために使われています。バックエンドの開発は一般的に使えません。だから、ブロガーは話していません。興味のある仲間は自分で百度で調べてみてください。

    4.列挙は一般的にswitch文と組み合わせることで、コードの可読性を高めることができます。
    最後に書くと
    ここでC言語のカスタムデータタイプの構造体、列挙と連携について詳しく解説した文章を紹介します。C言語に関するカスタムデータの種類については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。