今回から「構造体」を取り上げる。
学生(名前、身長、体重)を表す構造体を使うプログラムを作ってみよう。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.90.2)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
//学生を表す構造体を使うプログラム(宣言・初期化)
#include <stdio.h>
#define NAME_LEN 64
//学生を表す構造体
struct student
{
char name[NAME_LEN]; //名前
int height; //身長
float weight; //体重
};
int main(void)
{
struct student michio = {"Michio",172};
printf("名前=%s %p\n",michio.name, michio.name);
printf("身長=%d %p\n",michio.height,&michio.height);
printf("体重=%.1f %p\n",michio.weight,&michio.weight);
return 0;
}
実行結果
名前=Michio 0x7ffe0445b420
身長=172 0x7ffe0445b460
体重=0.0 0x7ffe0445b464
構造体(structure)
structで始まって、構造体タグ(structure tag)と呼ばれる名前(student)の後ろに、本体となる{ }が続き、セミコロン;で終わる形式である。
本体の{ }の中で宣言されているnameとheightとweightは、メンバ(member)と呼ばれる構造体の構成要素である。
name ・・・char型の名前、height・・・int型の身長、weight・・・float型の体重
メンバの初期化
構造体オブジェクトの宣言時に与える初期化子の形式は、配列用の初期化子と似ている。
各メンバに与える初期化子をコンマ,で区切って並べたものを{ }で囲んだ形式である。
なお、{ }内に初期化子が与えられていない要素が0で初期化されることも配列と同じである。
メンバのアクセス
構造体オブジェクトの個々のメンバのアクセスに利用するのが、一般にドット演算子と呼ばれる.演算子である。
メンバアドレスの取得
本プログラムでは、メンバの値だけでなく、アドレスも表示している。
身長、体重についてはアドレス演算子&を適用してアドレスを取得している。
名前のmichio.nameにはアドレス演算子&の適用が行われていないのは、nameが配列だからである。
(参考)新・解きながら学ぶC言語 第2版 柴田望洋 (監修・著)、 由梨かおる(著)SBクリエイティブ
コメント