Cのstructとtypedef structの違い

Mehvish Ashiq 2023年10月12日
  1. C の構造体
  2. Cのstructtypedef structの違い
  3. typedef キーワードを使用する際の重要なポイント
Cのstructとtypedef structの違い

このチュートリアルでは、コード例を使用して、C プログラミングにおける structtypedef struct の違いを説明し、実演します。

C の構造体

配列を使用する場合、同じ型/種類の多くのデータ項目を保持する変数の型を定義します。 同様に、C プログラミングには、構造体 と呼ばれる別のユーザー定義データ型があり、異なる型のデータ項目を組み合わせることができます。

構造体を使用してレコードを表すこともできます。 たとえば、各人物が次の属性を持つ人物の詳細を追跡できます。

  • ファーストネーム
  • 苗字
  • 性別
  • モバイル
  • Eメール
  • 住所

Cのstructtypedef structの違い

structtypedef struct を使用して構造体を定義できますが、typedef キーワードを使用すると、ユーザー定義のデータ型 (struct など) とプリミティブ データ型 (int など) の代替名を記述できます。

typedef キーワードは、既存のデータ型に新しい名前を作成しますが、新しいデータ型は作成しません。 typedef struct を使用すると、よりクリーンで読みやすいコードを作成できます。これにより、プログラマーはキーストロークからも解放されます。

typedef struct は、変数の宣言を簡素化し、同等のコードに簡素化された構文を提供します。 ただし、グローバル名前空間がより乱雑になる可能性があり、より大規模なプログラムで問題が発生する可能性があります。

両方のシナリオ (structtypedef struct) のサンプル コードを用意して、違いを理解しましょう。

typedef キーワードを使用しないコード例

#include <stdio.h>

struct Books {
  int id;
  char author[50];
  char title[50];
};

int main() {
  // declare `book1` and `book2` of type `Books`
  struct Books book1;
  struct Books book2;

  // the specifications for the `book1`
  book1.id = 1;
  strcpy(book1.author, "Zara Ali");
  strcpy(book1.title, "Tutorials for C Programming");

  // the specifications for the `book2`
  book2.id = 2;
  strcpy(book2.author, "Zaid Ali");
  strcpy(book2.title, "Tutorials for Java Programming");

  // display information for `book1` and `book2`
  printf("The id of book1: %d\n", book1.id);
  printf("The author of the book1: %s\n", book1.author);
  printf("The title of the book1: %s\n", book1.title);

  printf("The id of book2: %d\n", book2.id);
  printf("The author of the book2: %s\n", book2.author);
  printf("The title of the book2: %s\n", book2.title);

  return 0;
}

出力:

The id of book1: 1
The author of the book1: Zara Ali
The title of the book1: Tutorials for C Programming
The id of book2: 2
The author of the book2: Zaid Ali
The title of the book2: Tutorials for Java Programming

上記のコードには、Books 型の 2つの変数 book1book2 があります。 さらに変数を宣言する必要がある場合は、book3book4 などのように、struct を何度も入力する必要があります。

ここで、typedef struct の出番です。 typedef struct の使用を示す次のコード スニペットを参照してください。

typedef キーワードを使用したコード例

次の 2つの方法で typedef を使用できます。

方法 1:

#include <stdio.h>

struct Books {
  int id;
  char author[50];
  char title[50];
};

typedef struct Books Book;

int main() {
  // declare `book1` and `book2` of type `Book`
  Book book1;
  Book book2;

  // the specifications for the `book1`
  book1.id = 1;
  strcpy(book1.author, "Zara Ali");
  strcpy(book1.title, "Tutorials for C Programming");

  // the specifications for the `book2`
  book2.id = 2;
  strcpy(book2.author, "Zaid Ali");
  strcpy(book2.title, "Tutorials for Java Programming");

  // display information for `book1` and `book2`
  printf("The id of book1: %d\n", book1.id);
  printf("The author of the book1: %s\n", book1.author);
  printf("The title of the book1: %s\n", book1.title);

  printf("The id of book2: %d\n", book2.id);
  printf("The author of the book2: %s\n", book2.author);
  printf("The title of the book2: %s\n", book2.title);

  return 0;
}

出力:

The id of book1: 1
The author of the book1: Zara Ali
The title of the book1: Tutorials for C Programming
The id of book2: 2
The author of the book2: Zaid Ali
The title of the book2: Tutorials for Java Programming

方法 2:

#include <stdio.h>

typedef struct Books {
  int id;
  char author[50];
  char title[50];
} Book;

int main() {
  // declare `book1` and `book2` of type `Book`
  Book book1;
  Book book2;

  // the specifications for the `book1`
  book1.id = 1;
  strcpy(book1.author, "Zara Ali");
  strcpy(book1.title, "Tutorials for C Programming");

  // the specifications for the `book2`
  book2.id = 2;
  strcpy(book2.author, "Zaid Ali");
  strcpy(book2.title, "Tutorials for Java Programming");

  // display information for `book1` and `book2`
  printf("The id of book1: %d\n", book1.id);
  printf("The author of the book1: %s\n", book1.author);
  printf("The title of the book1: %s\n", book1.title);

  printf("The id of book2: %d\n", book2.id);
  printf("The author of the book2: %s\n", book2.author);
  printf("The title of the book2: %s\n", book2.title);

  return 0;
}

出力:

The id of book1: 1
The author of the book1: Zara Ali
The title of the book1: Tutorials for C Programming
The id of book2: 2
The author of the book2: Zaid Ali
The title of the book2: Tutorials for Java Programming

2 番目の方法は、typedef を使用すると、より整理され、クリーンで、理解しやすく、管理しやすいことを示しています。

typedef キーワードを使用する際の重要なポイント

typedef キーワードを使用する際には、いくつかの点を覚えておく必要があります。 上記のコードでは、次のように構造体を定義しています。

typedef struct Books {
  int id;
  char author[50];
  char title[50];
} Book;

ここでは、新しい構造体型 struct Books と、struct BooksBook という名前のエイリアスがあります。 typedef を含む別名が、他の通常の宣言と同様に宣言の最後に表示される理由を不思議に思うかもしれません。

typedef は、autostatic などのストレージ クラス指定子として正確な指定子のカテゴリに入れられました。 Book 型識別子のみを使用したい場合は、タグ名なしで宣言することもできます。

typedef struct {
  int id;
  char author[50];
  char title[50];
} Book;

構造体を使用している間は、変数とエイリアスと呼ぶべきものに注意する必要があります。 次のように匿名構造体を使用する場合 (構造体に名前がないため匿名)、Book はユーザー定義のデータ型構造体変数になります。

struct {
  int id;
  char author[50];
  char title[50];
} Book;

上記と同じ構造体を typedef キーワードとともに使用すると、Book はデータ型構造体のエイリアス (同義語) になり、それを使用して変数を宣言できます (以下を参照)。

typedef struct {
  int id;
  char author[50];
  char title[50];
} Book;
著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - C Struct