C構造体
Cは、変数データ項目に格納することができ、構造は 、データ項目の種類を格納することができる利用可能なCプログラミング別のユーザ定義のデータ型であり、同じタイプの配列を定義することを可能にします。
レコードの構造を表すために使用され、あなたが各書籍の次のプロパティを追跡する必要があり、あなたがダイナミック図書館の本を追跡するとします。
- タイトル
- 著者
- テーマ
- 書籍ID
定義構造
構造を定義するためには、構造体ステートメントを使用する必要があります。構造体の文が複数の部材を含む新しいデータ型を定義し、次のように、フォーマット構造体の文は、次のとおりです。
struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables];
構造体タグはオプションで、すべてのメンバーの定義には、私intとして変数の標準的な定義である;またはfをフロート;または他の有効な変数の定義。定義された構造の終わりには、セミコロンの前に最後のものは、あなたがオプションである1以上の構造の変数を、指定することができます。 ここで、構造体宣言の予約には、次のとおりです。
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
構造体メンバへのアクセス
構造体のメンバにアクセスするために、我々はメンバアクセス演算子を使用します(。)。 メンバーアクセス演算子は、変数名と我々のメンバーの構造が間にアクセスしたいの期間構造です。 あなたは、構造体のキーワードを用いた可変構造体の型を定義することができます。次の例は、構造体の使用方法を示しています。
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { struct Books Book1; /* 声明 Book1,类型为 Book */ struct Books Book2; /* 声明 Book2,类型为 Book */ /* Book1 详述 */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* Book2 详述 */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* 输出 Book1 信息 */ printf( "Book 1 title : %s\n", Book1.title); printf( "Book 1 author : %s\n", Book1.author); printf( "Book 1 subject : %s\n", Book1.subject); printf( "Book 1 book_id : %d\n", Book1.book_id); /* 输出 Book2 信息 */ printf( "Book 2 title : %s\n", Book2.title); printf( "Book 2 author : %s\n", Book2.author); printf( "Book 2 subject : %s\n", Book2.subject); printf( "Book 2 book_id : %d\n", Book2.book_id); return 0; }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
関数のパラメータとして構造
あなたは、変数やポインタの他のタイプと同様の機能パラメータ、上院の方法として、構造を置くことができます。 あなたは上記の例に構造体変数にアクセスする方法を使用することができます。
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; /* 函数声明 */ void printBook( struct Books book ); int main( ) { struct Books Book1; /* 声明 Book1,类型为 Book */ struct Books Book2; /* 声明 Book2,类型为 Book */ /* Book1 详述 */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* Book2 详述 */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* 输出 Book1 信息 */ printBook( Book1 ); /* 输出 Book2 信息 */ printBook( Book2 ); return 0; } void printBook( struct Books book ) { printf( "Book title : %s\n", book.title); printf( "Book author : %s\n", book.author); printf( "Book subject : %s\n", book.subject); printf( "Book book_id : %d\n", book.book_id); }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
Book title : C Programming Book author : Nuha Ali Book subject : C Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
構造体へのポインタ
あなたは、次のような方法ポインタ変数の他の類似のタイプへのリンクの定義、構造体へのポインタを定義することができます。
struct Books *struct_pointer;
今、あなたは、ポインタ変数の上記定義に格納構造変数に対処することができます。 次のように、構造体変数、構造体の名前の前に&演算子のアドレスを検索するには:
struct_pointer = &Book1;
:次のように、>オペレータ - 構造に部材構造のポイントにアクセスするためにポインタを使用するには、使用する必要があります。
struct_pointer->title;
のは、それはあなたが構造体のポインタの概念を理解するのに役立ちます上記の例を書き換えるために構造体のポインタを使用してみましょう:
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; /* 函数声明 */ void printBook( struct Books *book ); int main( ) { struct Books Book1; /* 声明 Book1,类型为 Book */ struct Books Book2; /* 声明 Book2,类型为 Book */ /* Book1 详述 */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* Book2 详述 */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* 通过传 Book1 的地址来输出 Book1 信息 */ printBook( &Book1 ); /* 通过传 Book2 的地址来输出 Book2 信息 */ printBook( &Book2 ); return 0; } void printBook( struct Books *book ) { printf( "Book title : %s\n", book->title); printf( "Book author : %s\n", book->author); printf( "Book subject : %s\n", book->subject); printf( "Book book_id : %d\n", book->book_id); }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
Book title : C Programming Book author : Nuha Ali Book subject : C Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
ビットフィールド
いくつかの情報が格納され、1つまたは数ビットを考慮しながら、完全なバイトを取る必要はありません。 例えば、バイナリビットを持つスイッチ、2つだけの状態0と1を格納するとき。 ストレージ・スペースを節約し、処理は、C言語で簡単であり、「ビット・フィールド」あるいはと呼ばれるデータ構造を提供するために、「ビットセグメント」を
いわゆる「ビット・フィールドは、「複数の異なる領域に分割バイナリ1バイトであり、各領域のビット数を示します。 各ドメインは、プログラムがドメイン名に従って動作することができ、ドメイン名を持っています。 だから我々は表現するためにバイトのバイナリビットフィールドと、いくつかの異なるオブジェクトを置くことができます。
典型的な例:
- バイナリでスイッチを格納し、2つだけの状態0と1。
- 外部ファイル形式を読む - 非標準ファイル形式を読み取ることができます。 たとえば、次の9ビットの整数。
説明は、ビットフィールド変数とビットフィールドを定義します
フォームに似たビットフィールドの定義と構造体定義:
struct 位域结构名 { 位域列表 };
どのフォームビットのフィールドリストであります:
类型说明符 位域名: 位域长度
例えば:
struct bs{ int a:8; int b:2; int c:6; };
同様に記載されビットフィールド変数と構造体変数を記載しました。 最初の定義が命令を記述し、定義した後に使用直接3通りの方法でこれを説明することができます。 例えば:
struct bs{ int a:8; int b:2; int c:6; }data;
BS可変データのための説明、2バイトの合計。 8ビットフィールドのビットフィールドbを占めている6ビットのフィールドcを占め、2を占めました。
例を見てみましょう:
struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int my_int:9; } pack;
4つの1ビットの識別子f1..f4、4ビットのタイプと9ビットmy_int:ここで、packed_structは、6つのメンバーを含みます。
ビットフィールドの定義については、次の命令があります。
ビットフィールドは、2バイトをまたがっていない、単一のバイトに格納されなければなりません。 バイトでない場合、十分な空間が別のドメインを保存するために、左のような、ビットフィールドから次の記憶装置であるべきです。 また、意図的に次のユニットからドメインを投稿することができます。 例えば:
struct bs{ unsigned a:4; unsigned :4; /* 空域 */ unsigned b:4; /* 从下一单元开始存放 */ unsigned c:4 }
このビットフィールドの定義では、4つの後の最初のバイトの4ビットは、彼らが4を占める、第二バイトからbは、0を埋めるために使用していないと述べた、cが4を占めています。
- ビットフィールドは、2バイトを横切って許可されていないので、ビット・フィールドの長さは1バイト長よりも大きくすることができないので、それは、8つ以上のバイナリではありません。 最大長は、コンピュータ全体のワード長よりも大きい場合には、いくつかのコンパイラは、メモリオーバーラップ領域を可能にし、いくつかのコンパイラは、次の単語の記憶領域の一部以上を置くことができます。
ビットフィールドは、それが唯一の塗りつぶしまたは調整位置として使用され、無名のビット・フィールドであることができます。 無名ビットフィールドを使用することはできません。 例えば:
struct k{ int a:1; int :2; /* 该 2 位不能使用 */ int b:3; int c:2; };
上記の分析から分かるように、ビット・フィールドは、基本的な構造のタイプであり、そのメンバーは、バイナリ分布によるものです。
ビットフィールドを使用します
同じ構造とビットフィールドを使用する人が、その一般的な形式:
位域变量名·位域名
ビットフィールドは、様々なフォーマットを可能にします。
次の例を考えてみます。
main(){ struct bs{ unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a=1; /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */ bit.b=7; /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */ bit.c=15; /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */ printf("%d,%d,%d\n",bit.a,bit.b,bit.c); /* 以整型量格式输出三个域的内容 */ pbit=&bit; /* 把位域变量 bit 的地址送给指针变量 pbit */ pbit->a=0; /* 用指针方式给位域 a 重新赋值,赋为 0 */ pbit->b&=3; /* 使用了复合的位运算符 "&=",相当于:pbit->b=pbit->b&3,位域 b 中原有值为 7,与 3 作按位与运算的结果为 3(111&011=011,十进制值为 3) */ pbit->c|=1; /* 使用了复合位运算符"|=",相当于:pbit->c=pbit->c|1,其结果为 15 */ printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c); /* 用指针方式输出了这三个域的值 */ }
プログラム例では、ビットフィールド構造BSを定義する、3ビットのフィールドは、A、B、Cです。 可変ビットBSやポインティングBS型のポインタ変数PBITの種類の説明。 このビットフィールドは、また、ポインタを使用することができ表します。