Cprogramming-c-structures
C-構造
配列を使用すると、同じ種類の複数のデータ項目を保持できる変数のタイプを定義できます。 同様に、 structure は、Cで使用可能な別のユーザー定義のデータ型であり、異なる種類のデータ項目を組み合わせることができます。
構造は、レコードを表すために使用されます。 図書館で本を追跡したいとします。 あなたは、各本に関する次の属性を追跡することができます-
- タイトル
- 著者
- 件名
- ブックID
構造の定義
構造を定義するには、 struct ステートメントを使用する必要があります。 structステートメントは、複数のメンバーを持つ新しいデータ型を定義します。 構造体ステートメントの形式は次のとおりです-
struct [structure tag] {
member definition;
member definition;
...
member definition;
} [one or more structure variables];
- 構造タグ*はオプションであり、各メンバー定義はint iなどの通常の変数定義です。またはfloat f;または他の有効な変数定義。 構造の定義の最後で、最後のセミコロンの前に、1つ以上の構造変数を指定できますが、これはオプションです。 ここにあなたが本の構造を宣言する方法があります-
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
構造体メンバーへのアクセス
構造体のメンバーにアクセスするには、* memberアクセス演算子(。)を使用します。 メンバーアクセス演算子は、構造変数名とアクセスする構造メンバーの間のピリオドとしてコーディングされます。 キーワード *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;
これで、上記で定義したポインター変数に構造変数のアドレスを保存できます。 構造変数のアドレスを見つけるには、「&amp」を配置します。次のように構造体の名前の前に演算子-
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
ビットフィールド
ビットフィールドを使用すると、構造体にデータをパックできます。 これは、メモリまたはデータストレージが貴重な場合に特に便利です。 典型的な例を含める-
- 複数のオブジェクトを機械語にパックします。 e.g. 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は、フィールドの最大長がコンピュータの整数ワード長以下である場合、上記のビットフィールドを可能な限りコンパクトに自動的にパックします。 そうでない場合、一部のコンパイラはフィールドのメモリオーバーラップを許可し、他のコンパイラは次のワードの次のフィールドを保存します。