c言語学習9日目
学習メモを書いていきます。
記事内のプログラムは苦しんで覚えるc言語から引用しています。
構造体
・構造体型の宣言の仕方の復習→typedef
・構造体の引数
・構造体で情報を渡す
構造体変数は、それ自体が1つの変数として扱われる。したがって「構造体型の引数」を使うことが出来る。
→メリット:一度に複数の情報を渡すことが出来る
生徒の身体測定
プログラム①
typedef struct//構造体タグを省略している
{
int year;
int group;
int number;
char name[64];
double stature;
double weight;
}student;//「student型」という名の「構造体型」を宣言した
//プロトタイプ宣言
void student_print(student data);
//main関数で構造体要素を決めている→関数の呼び出し
int main(void)
{
student data;//「student型」を使用するための構造体変数dataを宣言
data.year = 3;
data.group = 4;
data.number = 18;
strcpy_s(data.name, 64, "MARIO");
data.stature = 178.0;
data.weight = 81.0;
student_print(data);//関数の定義でstudent型(構造体型)の構造体変数dataを引数として定義したので、引数として通常の関数と同様にdataを使用している。
return 0;
}
//構造体型の変数(構造体変数)を引数とした関数を定義
void student_print(student data)
{
printf("[学年]:%d\n", data.year);
printf("[クラス]:%d\n", data.group);
printf("[出席番号]:%d\n", data.number);
printf("[名前]:%s\n", data.name);
printf("[身長]:%f\n", data.stature);
printf("[体重]:%f\n", data.weight);
return;
}
・構造体型のポインタ変数
整数型のポインタ変数同様、構造体型のポインタ変数も作ることが出来る。
書式としては二通りある
→(*構造体ポインタ変数名).要素名
→構造体ポインタ変数名->要素名
プログラム②
typedef struct//構造体タグを省略している
{
int year;
int group;
int number;
char name[64];
double stature;
double weight;
}student;//student型を宣言
int main(void)
{
student *pdata,data;
pdata = &data;
(*pdata).year = 10;
strcpy_s((*pdata).name, 64, "MARIO");
printf("(*pdata).year:%d\n", (*pdata).year);
printf("data.year:%d\n", data.year);
printf("(*pdata).name:%s\n", (*pdata).name);
printf("data.name:%s\n", data.name);
return 0;
}
・構造体型のポインタ変数を引数に持つ関数の作成
生徒の身体測定
プログラム③
typedef struct//構造体タグを省略している
{
int year;
int group;
int number;
char name[64];
double stature;
double weight;
}student;
void student_print(student *pdata);//プロトタイプ宣言
int main(void)
{
student data;//「student型」を使用するための構造体変数dataを宣言
data.year = 3;
data.group = 4;
data.number = 18;
strcpy_s(data.name, 64, "MARIO");
data.stature = 178.0;
data.weight = 81.0;
student_print(&data);//構造体変数dataのアドレスを関数のポインタ変数に渡している
return 0;
}
void student_print(student *pdata)
{
printf("[学年]:%d\n", (*pdata).year);
printf("[クラス]:%d\n", (*pdata).group);
printf("[出席番号]:%d\n", (*pdata).number);
printf("[名前]:%s\n", (*pdata).name);
printf("[身長]:%f\n", (*pdata).stature);
printf("[体重]:%f\n", (*pdata).weight);
return;
}
プログラム①と③を比較してみる
①は関数に直接、構造体情報のコピーを渡している。
③は構造体型のポインタ変数を使用して、関数に構造体情報を渡している。
「苦しんで覚えるc言語」では③のように書くメリットは、
(1)関数内で値を変更ずることが出来る
(2)関数の呼び出しの高速化
らしいが、(1)の場面がまだ思い浮かばない
・構造体の配列
プログラム例:
student data[10];
data[1].year=3;
strcpy_s(data[1].name,64,"MARIO");
→複数の生徒の身体測定の情報を記録しておくことは可能かと