「名前、身長、体重」のデータを3人分扱う時のことを考えてみる。このときに用いる変数として
char name1[40];
int height1;
int weight1;
char name2[40];
int height2;
int weight2;
char name3[40];
int height3;
int weight3;
// 全部で 3x3=9個の変数
とするのが正解か??
→「名前、身長、体重」の3つをまとめて使いたい場合、データの組み合わせ定義
=構造体、を使うと便利
たとえば「名前、身長、体重」のデータをひとつにまとめて「個人データ」として考える。個人データを「person」とすると、
struct person{
char name[40];
int height;
int weight;
}
のようにすることで、ユーザーが作成するデータ型(person型と言える)を定義することができる。
struct person p1,p2,p3;
とすれば person 構造体のデータが3つ用意できる。
hellostruct.c
#include <stdio.h>
#include <string.h>
// 文字列処理に string.h が必要
struct person{ // 個人データ
char name[40]; // 名前
int height; // 身長
int weight; // 体重
}; // セミコロン「;」が必要
int main(void){
struct person p;
strcpy(p.name,"鈴木一郎");
p.height=180;
p.weight=70;
printf("名前=%s,身長=%d,体重=%d\n",
p.name,p.height,p.weight);
}
身長、体重を代入したい場合
p1.height = 180;
p1.weight = 70;
とすれば良い。
名前を代入したい場合
strcpy(p1.name,"山田太郎")
とすれば良い。
# strcpy関数は string.h に用意されている標準ライブラリ関数。
構造体もデータ型の一つなので
・構造体の初期化
・構造体の配列
・構造体へのポインタ
・構造体を関数に渡す
などは、int などのデータ型と同様に行える。
struct person *p = &p1
のように、構造体へのポインタを定義した場合、
p->height = 180;
のような利用方法になる。「->」は矢印と考えて良い。
【注意】
C言語では
p1.name = "山田太郎“;
とはできない
hellostruct.c
#include <stdio.h>
#include <string.h>
// 文字列処理に string.h が必要
struct person{ // 個人データ
char name[40]; // 名前
int height; // 身長
int weight; // 体重
}; // セミコロン「;」が必要
int main(void){
struct person p;
strcpy(p.name,"鈴木一郎");
p.height=180;
p.weight=70;
printf("名前=%s,身長=%d,体重=%d\n",
p.name,p.height,p.weight);
}
hellostructpointer.c
#include <stdio.h>
#include <string.h>
// 文字列処理に string.h が必要
struct person{ // 個人データ
char name[40]; // 名前
struct person *next;
}; // セミコロン「;」が必要
int main(void){
struct person p1,p2,p3,*pointer;
strcpy(p1.name,"鈴木一郎");
strcpy(p2.name,"福留孝介");
strcpy(p3.name,"松井秀喜");
// ポインタをセット
p1.next = &p2; // 鈴木の次は福留
p2.next = &p3; // 福留の次は松井
p3.next = NULL; // 松井の次は定義しない
pointer = &p1;
// NULL は「セットされていない」の意味。特別な定数
while(pointer!=NULL){
printf("名前=%s\n",pointer->name);
pointer=pointer->next;// 次のポインタ
}
}
実行結果
C:\myc>hellostructpointer.exe
名前=鈴木一郎
名前=福留孝介
名前=松井秀喜
ポインタの値を以下のように変えると実行結果も変わる
// ポインタをセット
p1.next = NULL; // 鈴木の次は定義しない
p2.next = &p1; // 福留の次は鈴木
p3.next = &p2; // 松井の次は福留
pointer = &p3; // 先頭は松井
実行結果
C:\myc>hellostructpointer.exe
名前=松井秀喜
名前=福留孝介
名前=鈴木一郎
構造体とポインタを組み合わせると
「リスト」(=長さを指定しない配列のような構造)を定義することができる
余力があれば教科書233ページ練習問題
リスト (p233list.c)
hellostruct.c
hellostructpointer.c
をメールに添付して提出。
〆切り時間の授業前日まで