C - 構造
配列を使用すると、同じ種類の複数のデータ項目を保持できる変数の型を定義できます。同様に構造 C で利用できる別のユーザー定義データ型で、異なる種類のデータ項目を組み合わせることができます。
構造体は、レコードを表すために使用されます。図書館で自分の本を追跡したいとします。各本について次の属性を追跡することをお勧めします −
- タイトル
- 著者
- 件名
- 書籍 ID
構造の定義
構造体を定義するには、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 では、変数の後に :bit length を置くことにより、構造体定義でこれを行うことができます。たとえば-
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 には 6 つのメンバーが含まれています:4 つの 1 ビット フラグ f1..f3、4 ビットの型、および 9 ビットの my_int.
C は、フィールドの最大長がコンピューターの整数ワード長以下である場合、上記のビット フィールドを可能な限りコンパクトに自動的にパックします。そうでない場合、一部のコンパイラはフィールドのメモリ オーバーラップを許可する場合がありますが、他のコンパイラは次のフィールドを次のワードに格納する場合があります。
C言語