Thinkers'Studio
JavaとC言語の自習ツール
構造体へのポインタを関数に渡して構造体配列を操作する

 今回は構造体へのポインタ関数に渡し、構造体配列のメンバを更新する例です。

【 構造体へのポインタを関数に渡すプログラム例 】
 関数 setBmi は、shape_t 構造体へのポインタとそれが指す構造体配列の要素数を引数にとります。
 ポインタを進めながら、メンバ変数 height, weight を使って BMI指数を求め、全要素のメンバ bmi に格納します。
   BMI指数 = 体重kg / (身長m * 身長m)
#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に入れたのと同じ値

   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 宣言:構造体宣言, 構造体タグ名  構造体配列:読み込み, 関数操作, ソート, ポインタソート
        リスト構造, 構造体を関数の戻り値に
[ ご案内 ] 構造体の要点を学習できるコース:要点講座 [ 構造体編 ]

前回のクイズの答え: (前回の問題を見る
呼び出し方は変わりません。配列版と同様、配列名 stars と書いてその先頭のアドレスを綿します。
 mt = whoIsTallest2( stars, NSTARS );
関数の処理内容を配列版からポインタ版にそのまま置き換えるなら、 s[num].height をすべて (p+num)->height に書き換えます。 p+num は p が指す配列の先頭から num個分先のアドレスで、(p+num)->height はそのアドレスにある要素のメンバー height の値です。