今回は構造体へのポインタを関数に渡し、構造体配列のメンバを更新する例です。
【 構造体へのポインタを関数に渡すプログラム例 】#include <stdio.h> #define NSTARS ((sizeof stars)/(sizeof(shape_t))) //stars配列の要素数を求める typedef struct { char name[32]; float height; float weight; float bmi; } shape_t; // BMI指数を求めてメンバbmiに保存する void setBmi( shape_t *p, int num ) { int i; float hm; for( i = 0; i < num; i++ ) { hm = p->height * 0.01; // 身長をm単位に p->bmi = p->weight / ( hm * hm ); p++; } } main() { shape_t stars[] = { { "ブラッド・ピット", 183.2, 73.4 } , { "トム・クルーズ", 170.1, 67.2 } , { "ジョニー・デップ", 178.2, 70.5 } , { "サモ・ハン・キンポー", 172.0, 111.1 } , { "ウィル・スミス", 188.0, 78.3 } , { "アンジェリーナ・ジョリー", 173.0, 45.0 } }; int i; shape_t *p; setBmi( stars, NSTARS ); p = stars; for( i = 0; i < NSTARS; i++ ) { printf( "%sのBMI指数は %.1f。", p->name, p->bmi ); if( p->bmi < 18.5 ) printf( "やせ型です\n" ); else if( p->bmi < 25.0 ) printf( "標準です\n" ); else printf( "肥満です\n" ); p++; } }
関数の形式 void setBmi( shape_t *p, int num )
呼び出し方 setBmi( stars, NSTARS ); <-- 構造体配列の先頭アドレスを渡す
main では setBmi で設定された bmi の値を判定して「やせ型」「標準」などの評価をプリントします。ここでも構造体へのポインタを使って参照する方法としました。なお、スターの身長や体重は実際とは異なる場合があります。
(今回のクイズです)
stars の初期化でメンバ変数 bmi には値を指定していません。
bmi にはどんな値が入るでしょうか? 3択です。
(1)不定値, (2)0.0, (3)その前のメンバweightに入れたのと同じ値
[ 関連記事 ] 宣言:構造体宣言,
構造体タグ名
構造体配列:読み込み, 関数操作, ソート, ポインタソート
リスト構造,
構造体を関数の戻り値に
[ ご案内 ] 構造体の要点を学習できるコース:要点講座 [ 構造体編 ]
mt = whoIsTallest2( stars, NSTARS );関数の処理内容を配列版からポインタ版にそのまま置き換えるなら、 s[num].height をすべて (p+num)->height に書き換えます。 p+num は p が指す配列の先頭から num個分先のアドレスで、(p+num)->height はそのアドレスにある要素のメンバー height の値です。