【C言語】ローカルスコープで構造体を定義する方法を解説
構造体とは
構造体(structure)とは、異なるデータ型を持つ複数の変数を、ひとつの名前のもとにまとめて扱えるようにしたデータ構造です。C言語では、関連性のあるデータをグループ化することで、プログラムの可読性や保守性を高めることができます。
構造体の主な特徴
構造体には以下のような特徴があります。
- 代入演算子を使用することで、ある構造体変数の全メンバーの内容を、同じ型の別の構造体変数へ一括してコピーできます。
- 複雑なデータを扱う場合には、構造体の中にさらに別の構造体を含める「入れ子構造(ネストされた構造体)」を作成すると効果的です。
- 関数への引数として、構造体全体・個々のメンバー・構造体のアドレスのいずれも渡すことが可能です。
- 構造体へのポインタ(構造体ポインタ)を作成することもできます。
構造体の宣言方法
構造体宣言の一般的な書式は以下の通りです。
struct タグ名{
データ型 メンバー1;
データ型 メンバー2;
...
データ型 メンバーn;
};ここで、structはキーワード、タグ名は構造体の名前、メンバーは構造体内の各データ項目を表します。
例えば、書籍情報を管理する構造体は次のように宣言します。
struct book{
int pages;
char author[30];
float price;
};ローカルスコープでの構造体定義サンプル
以下は、ローカルスコープ(関数内)で構造体を定義して使用するCプログラムの例です。main関数外と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=65000;
else
manager.salary=55000;
return manager.salary;
}
int main(){
printf("enter the name of emp1:");
scanf("%s",emp1.name);
printf(" enter the add of emp1:");
scanf("%s",emp1.add);
printf(" enter the salary of emp1:");
scanf("%d",&emp1.salary);
printf(" enter the name of emp2:");
scanf("%s",emp2.name);
printf(" enter the add of emp2:");
scanf("%s",emp2.add);
printf(" enter the salary of emp2:");
scanf("%d",&emp2.salary);
printf(" emp1 salary is %d",emp1.salary);
printf(" emp2 salary is %d",emp2.salary);
printf(" manager salary is %d",manager());
return 0;
}
実行結果
上記プログラムをコンパイルして実行すると、以下のような出力が得られます。
enter the name of emp1:hari
enter the add of emp1:hyderabad
enter the salary of emp1:4000
enter the name of emp2:lucky
enter the add of emp2:chennai
enter the salary of emp2:5000
emp1 salary is 4000
emp2 salary is 5000
manager salary is 55000
プログラムのポイント
このプログラムでは、タグ名を持たない無名構造体をファイルスコープで定義し、その変数としてemp1とemp2を宣言しています。一方、manager関数内では同じメンバー構成を持つ別の構造体をローカルに定義しています。managerの年齢は27歳に設定されているため、条件分岐(if文)によって55000が給与として返されます。このように、スコープごとに独立した構造体を定義できることがC言語の柔軟性の一つと言えます。
-
構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説
ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型
-
再帰を使って階乗を計算するC#プログラムの作成方法
この記事では、C#で再帰(リカーシブ)関数を使用して数値の階乗を計算する方法を解説します。サンプルコードでは、checkFact() という再帰関数を定義し、これを呼び出すことで階乗を求めています。再帰の基本構造:ベースケースまず、再帰関数には必ず終了条件(ベースケース)が必要です。引数の値が 1 の場合、1の階乗は1であるため、そのまま 1 を返します。if (n == 1) return 1;5! を求める場合の処理の流れベースケースに達するまで、関数は自分自身を呼び出し続けます。例として 5!(5の階乗)を計算する場合、再帰呼び出しは次のような流れで進みます。反復1: 5 * ch