Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のローカルスコープにおける構造体とは?基本から実例まで解説

構造体(structure)とは、int・char・float など異なるデータ型を持つ複数の変数を、ひとつの名前のもとにまとめたデータ構造です。関連するデータをグループ化できるため、プログラムの可読性と管理性が向上します。

構造体宣言の一般的な形式

構造体は次のように宣言します。

struct タグ名{
    データ型 メンバ1;
    データ型 メンバ2;
    データ型 メンバn;
};
  • struct … 構造体を定義するためのキーワードです。
  • タグ名 … 構造体に付ける名前を指定します。
  • メンバ1、メンバ2… … 構造体を構成する個々のデータ項目(メンバ)を指定します。

ローカルスコープでの構造体定義とは

C言語では、構造体を関数の外(グローバルスコープ)でも関数の中(ローカルスコープ)でも定義できます。関数内で定義された構造体は、その関数の中でのみ有効となり、他の関数からはアクセスできません。これが「ローカルスコープでの構造体」です。

例:書籍情報を表す構造体

struct book{
    int pages;       /* ページ数 */
    char author[30]; /* 著者名   */
    float price;     /* 価格     */
};

ローカルスコープの構造体を使ったサンプルプログラム

次のプログラムでは、従業員用の構造体をグローバルに定義し、さらに manager() 関数の中でマネージャー用の構造体をローカルスコープで定義しています。

#include<stdio.h>
struct{
    char name[20];
    int age;
    int salary;
    char add[30];
}emp1,emp2;

int manager(){
    struct{ /* ローカルスコープでの構造体定義 */
        char name[20];
        int age;
        int salary;
        char add[50];
    }manager;
    manager.age=27;
    if(manager.age>30)
        manager.salary=650000;
    else
        manager.salary=550000;
    return manager.salary;
}

int main(){
    printf("enter the name of emp1:");
    scanf("%s",emp1.name);
    printf("\nenter the add of emp1:");
    scanf("%s",emp1.add);
    printf("\nenter the salary of emp1:");
    scanf("%d",&emp1.salary);
    printf("\nenter the name of emp2:");
    scanf("%s",emp2.name);
    printf("\nenter the add of emp2:");
    scanf("%s",emp2.add);
    printf("\nenter the salary of emp2:");
    scanf("%d",&emp2.salary);
    printf("\nemp1 salary is %d",emp1.salary);
    printf("\nemp2 salary is %d",emp2.salary);
    printf("\nmanager salary is %d",manager());
    return 0;
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

enter the name of emp1:Bob
enter the add of emp1:Hyderabad
enter the salary of emp1:500000
enter the name of emp2:Hari
enter the add of emp2:Chennai
enter the salary of emp2:450000
emp1 salary is 500000
emp2 salary is 450000
manager salary is 550000

解説

このプログラムでは、まず main() 関数内で emp1 と emp2 の名前・住所・給料を入力し、それぞれの給料を表示しています。

一方、manager() 関数内で定義された構造体変数 manager はローカルスコープに存在するため、この関数内でしか利用できません。年齢が 27 歳と設定されており、条件式 manager.age > 30 が偽となるため、給料として 550000 が返されます。

まとめ

  • 構造体を使うと、異なるデータ型の変数をひとつの名前でまとめて扱えます。
  • 関数内で定義した構造体はローカルスコープを持ち、その関数内でのみ有効です。
  • ローカルな構造体は、特定の関数だけで必要なデータをカプセル化したい場合に便利です。
  1. C#プログラミングとは?初心者にもわかる特徴と基本を徹底解説

    C#(シーシャープ)とは何かC#は、Microsoft(マイクロソフト)が開発したモダンで汎用性の高いオブジェクト指向プログラミング言語です。Windowsアプリケーションの開発をはじめ、Webサービス、ゲーム開発(Unity)、業務システムなど、幅広い分野で活用されています。C#は「共通言語基盤(CLI:Common Language Infrastructure)」向けに設計されています。CLIは実行可能なコードとランタイム環境から構成されており、これにより異なるコンピュータプラットフォームやアーキテクチャ上で、さまざまな高水準言語を利用できるようになっています。C#の主な特徴C#には、開

  2. C#の構造体(struct)とは?特徴と定義方法をわかりやすく解説

    C#における構造体(struct)は、値型に分類されるデータ型です。1つの変数の中に、文字列や数値など異なるデータ型の関連データをまとめて格納できるのが大きな特徴です。構造体を作成する際には、structキーワードを使用します。C#の構造体の主な特徴メソッド、フィールド、インデクサー、プロパティ、演算子メソッド、イベントを持つことができます。コンストラクターを定義できますが、デストラクターは定義できません。また、引数なしの既定のコンストラクターは自動的に定義されるため、開発者が独自に定義することはできません。クラスと異なり、他の構造体やクラスを継承することはできません。他の構造体やクラスの基底