アキヒロの日誌

理系大学院生の戦闘記録

c言語学習9日目

学習メモを書いていきます。
記事内のプログラムは苦しんで覚えるc言語から引用しています。
苦しんで覚えるC言語

苦しんで覚える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");
複数の生徒の身体測定の情報を記録しておくことは可能かと