構造体と関数


まず、一般の関数の要点をまとめると、次のようになります。

@ 変数は関数の実引数として使用できる。
A
関数の仮引数には、実引数として指定された変数の値がコピーされます。ただし外部変数や配列変数はコピーされません。
B 呼び出された関数が呼び出しもとの関数の変数を直接変更することは出来ません。しかし、変数を指すポインタを引数に指定すれば呼び出し元の変数の値を間接的に変更できます

これらの点は、構造体変数が引数でも同じです。通常のように構造体変数の内容をそっくりそのまま渡すことも出来ますし、構造体変数のアドレスを渡すことも出来ます。

struct card {int id;char name[20];char add[50];
char
tel[20];int age;}
                                            「型宣言」
int change(struct card a1);                                     「プロトタイプ宣言」
main(


struct
card a1;
                                                      「構造体変数の宣言」
int
num;
a1.id=1;
a1.name=”山田
太郎”; a1.add=”東京都新宿区神楽坂1−3”;
a1.tel=”00−0000−0000”;
a1.age=20;
num=change(a1);
                                               「関数の使用宣言」
if
(num==0)
printf(”ID番号は1です。¥n”);
else
printf(”ID番号は1ではありません。¥n”);

int change(struct card a1);

if
(a1.id==1) return(0);
else
return(1);

(実行結果)
ID番号は1です。


ちなみに、関数change(
)をint change(struct card a1);のようにプロトタイプ宣言していますが、変数a1を省略して、
int
change(struct card);
のようにも出来ます。
プロトタイプ宣言した後、呼び出し側では、
change(a1)
で、a1を実引数として渡し、受け取り側では、
int
change (struct card
a1)
で仮引数a1を受け取っています。

change(a1)→ int change(struct card a1)

このように構造体引数を値渡しすると、対象となる構造体の内容がすべて仮引数にコピーされます。しかし、この方法では呼び出された側の関数では構造体の内容は変更できません。

呼び出された側の関数で構造体の内容を変更するためには、呼び出し側で実引数として構造体変数のアドレスを渡し、呼び出された側では、構造体のポインタ表現を用いて操作します。ポインタ表現を用いてさきほどのプログラムをchange( )関数内で構造体変数の内容を書き換えられるようににしてみると次のようになります。

 

stuct card {int id;char name[20];char add[50];
char tel[20];int age; };
void change(struct card * a1_ptr);
main( ){
struct card a1、*a1_ptr;
a1.id=1; a1.name=”山田 太郎”; a1.add=”東京都新宿区神楽坂1−3”;
a1.tel=”00-0000-0000”; a1.age=20;
a1_ptr=&a1;
change(a1_ptr);
printf(”ID:%d、名前:%s、住所:%s、電話番号:%s、年齢:%d¥n”,
a1.id,a1.name,a1.add,a1.tel,a1.age);

void change(struct card * a1_ptr)
a1_ptr−>id=2;
a1_ptr−>name=”鈴木 一郎”;
a1_ptr−>add=”千葉県野田市1−3”;
a1_ptr−>tel=”11−1111−1111”;
a1_ptr−>age=22;
(実行結果)
ID:2,名前:鈴木 一郎、住所:千葉県野田市1−3、電話番号:11−1111−1111、
年齢:22

 


「基礎講座もくじへ」

「Q&Aもくじへ」

「次へ」