構造はレコードを表すために使用されます。 あなたが図書館であなたの本を追跡したいとします。 各本の次の属性を追跡することができます。
- タイトル
- 著者
- 件名
- 書籍ID
構造の定義
構造体を定義するには、struct文を使用する必要があります。 structステートメントは、複数のメンバーを持つ新しいデータ型を定義します。 struct文の書式は次のとおりです
構造体を定義するには、struct文を使用する必要があります。 structステートメントは、複数のメンバーを持つ新しいデータ型を定義します。 struct文の書式は次のとおりです
struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables];
構造タグはオプションで、各メンバ定義はint iのような通常の変数定義です。 またはフロートf。 またはその他の有効な変数定義を使用します。 構造体の定義の最後に、最後のセミコロンの前に、1つ以上の構造体変数を指定できますが、これはオプションです。 Book構造を宣言する方法は次のとおりです
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
構造体メンバへのアクセス
構造体のメンバーにアクセスするには、メンバーアクセス演算子(。)を使用します。 メンバーアクセス演算子は、構造変数名とアクセスしたい構造メンバーの間のピリオドとしてコード化されています。 キーワードstructを使用して、構造タイプの変数を定義します。 次の例は、プログラム内で構造体を使用する方法を示しています
#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; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* book 2 specification */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* print Book1 info */ 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); /* print Book2 info */ 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; }; /* function declaration */ void printBook( struct Books book ); int main( ) { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* book 2 specification */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* print Book1 info */ printBook( Book1 ); /* Print Book2 info */ 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; }; /* function declaration */ void printBook( struct Books *book ); int main( ) { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* book 2 specification */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* print Book1 info by passing address of Book1 */ printBook( &Book1 ); /* print Book2 info by passing address of 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ビットフラグを圧縮することができます。
- 外部ファイルフォーマットを読む - 非標準ファイルフォーマットは、例えば9ビット整数で読み取ることができる。
Cでは構造体の定義でこれを行うことができます。変数の後ろのビットの長さ。 例えば
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;
ここでpacked_structには、4つの1ビット・フラグf1..f3、4ビット・タイプ、および9ビットmy_intの6つのメンバーが含まれています。
フィールドの最大長がコンピュータの整数ワードの長さ以下であれば、Cは自動的に上記のビットフィールドをできるだけコンパクトにパックします。 これが当てはまらない場合、いくつかのコンパイラはフィールドのメモリオーバーラップを許可し、他のコンパイラは次のフィールドの次のフィールドを格納します。
No comments:
Post a Comment