黒馬プログラマー----C言語学習ノートの構造体

3607 ワード

---Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング------
1.C言語構築タイプ
構築データ型:定義された1つ以上のデータ型に基づいて構築方法で定義されます.つまり、1つのコンストラクションタイプの値を複数のメンバーまたは要素に分解できます.各メンバーは、基本データ型または構造型です.
 
C言語では、構造タイプは以下のようなものがあります
配列タイプ
構造体タイプ
コモンタイプ
 
2.構造体とは
 
実際の問題では、1組のデータは往々にして異なるデータ型を有し、例えば、学生登録表では、名前は文字型であり、学号は整数型または文字型であり、年齢は整数型、性別ビット文字型、成績ビット整数型または実型であることができる.このデータのセットを1つの配列で格納することは明らかではありません.配列内の各要素のタイプと長さが一致しなければならないからです.システム処理のコンパイルを容易にします.この問題を解決するために.C言語では、構造体または構造体という別の構造データ型が与えられる.他の高度な言語のレコードに相当します
 
Structureは、複数のメンバーから構成される構造タイプです.各メンバーは、基本データ型または構造型のいずれかになります.構造は「構築」されたデータ型であり、説明と使用の前に定義する必要があります.つまり、構築する必要があります.関数を説明して呼び出す前に関数を定義するのと同じです.
 
3、なぜ構造タイプから?
構造体は機能の同じデータを組織することができて、一汽に輝いて、使う時便利で、しかも関数呼び出しの時、いくつかのデータを伝達するのは不便で、しかし構造体でこれらのデータを組織するならば、直接1つの構造体を伝達すればいいです.
 
4、構造体を定義する方法
構造を定義する一般的な形式は、次のとおりです.
struct構造名{
メンバーのリスト;
};
【注意】構造体定義が完了してもスペースが割り当てられていない
たとえば
//       
struct Student{
    int schoolId;
    char name[20];
    int age;
    float score;
};//  ,        

 
5.構造変数のメンバーへのアクセス方法
一般形式:
構造変数名メンバー変数
例:
   
 //1.       
    //        
    struct Student st;
  
    // .           
    st.schoolId = 1;
    strcpy(st.name, "Amos");
    st.age = 24;
    st.score = 90.5f;
    //2、        
    struct Student st2 = {2,"Allen",22,90.0f};
   
    printf("      schoolId:%d, name: %s, age:%d, score:%0.2f
",st.schoolId,st.name,st.age,st.score); printf(" schoolId:%d, name: %s, age:%d, score:%0.2f
",st2.schoolId,st2.name,st2.age,st2.score);

 
印刷結果:
最初の学生schoolId:1,name:Amos,age:24,score:90.50
2番目の学生schoolId:2,name:Allen,age:22,score:90.00
 
 
6.記憶原理
メモリはバイト単位で番号付けされていますが、一部のハードウェアプラットフォームでは、特定のタイプのデータに対して特定のアドレスからのみ開始できます.たとえば、偶数アドレスから開始し、プラットフォームに適した要求に従ってデータの格納を行わないと、効率に影響します.したがって、メモリには、各タイプのデータが一定のルールでメモリに格納されます.これが位置合わせの問題です.
 
構造体が占有するメモリ領域は、各メンバーが占有するバイト数の和(位置合わせの問題を考慮)です.
 
7、構造体データメンバーの位置合わせの意味
多くの実際のコンピュータシステムは、基本タイプのデータがメモリに格納される位置に制限があり、これらのデータの開始アドレスの値が数kの倍数であることを要求します.これがいわゆるメモリアライメントです.このkは、データタイプのアライメントモジュールと呼ばれます.
 
 
このような強制的な要件は、プロセッサとメモリ間の伝送システムの設計を簡素化し、データの読み取り速度を向上させることができる.例えば、メモリを読み出すたびにある8倍のアドレスから始まり、1回に8つの自分のデータを読み出したり書き込みたりするプロセッサで、doubleタイプのデータが8倍のアドレスから始まることを保証するソフトウェアを追加すると、doubleタイプのデータを読み書きするには、順次メモリ操作が必要になります.そうでなければ、データ取得が整列要件を満たす2つのバイトメモリブロックにわたってノックされるため、この動作を完了するには2回のメモリ操作が必要になります.
 
8、構造体変数の占有ストレージスペースの大きさ
8.1構造体の大きさの計算方法と手順
 
1)構造内のすべてのデータメンバーの長さをsum_として加算a
2)個のデータメンバーをメモリの位置合わせのために、それぞれの位置合わせモジュール数によって埋め込まれたバイト数をsum_に加算するa上、sum_と記すb.整列モジュール数は、#pragma packが指定した数値と、そのデータメンバー自身の長さの中で数値が小さいものです.このデータの相対開始位置は、整列モードの整数倍であるべきである.
3)sum_b構造体モジュールに整列し、整列モジュールはpragma pacが指定した数値と構造体内部最大の基本データ型メンバー長のうち数値が小さいもの、およびそのデータメンバー自身の長さのうち数値が小さいものである.構造体の長さは、整列モジュールの整数倍であるべきです.
整列モジュール:【一般的には、構造体内部で最大の基本データ型メンバー長】
Nに整列するという値は、「格納元アドレス%N=0」
 
例:
//     
struct Student{
    int schoolId;//4
    char name[20];//20 --->      4   ,    20     
    char sex;//1 --->      4,      
    int age;//4
    float score;//4
};
 
 
   //        
    struct Student st;
    printf("size %ld", sizeof(st));

印刷結果;
size 36
 
解析結果:
想像していた4+20+1+4+4=33ではなく、36
この構造体における占有バイト数対が大きいのは4であるため、モジュール数は4である
だから4+20+4+4+4=36で計算すべきです
 
 
9.構造体の作用域
関数外で定義されるのはグローバル構造体で、役割ドメインは定義された場所からファイルが終了するまで定義されます.
関数内で定義されるのはローカル構造体で、役割ドメインは定義位置から関数が終了するまでです.