構造体へのポインタを引数に使う場合を考える。
ポイントは、
struct Car car1; //構造体の宣言 void show(Car *pC) //構造体へのポインタを引数に持つ関数 { car1->num; //アロー演算子で構造体へのポインタから構造体のメンバ変数にアクセス car2->gas; }
サンプルコード
#include <stdio.h> typedef struct Car{ int num; double gas; }Car; void show(Car *pC); int main(void){ Car car1 = {0,0.0}; printf("ナンバーを入力してください。\n"); scanf("%d", &car1.num); printf("ガソリン量を入力してください。\n"); scanf("%lf", &car1.gas); show(&car1); return 0; } void show(Car *pC){ printf("車のナンバーは%d,ガソリン量は%fです。\n",pC->num,pC->gas); }
出力結果
ナンバーを入力してください。 12 ガソリン量を入力してください。 3.4 車のナンバーは12,ガソリン量は3.400000です。
このコードを見てて思ったのだが、
printf("車のナンバーは%d,ガソリン量は%fです。\n",pC->num,pC->gas);
を、次のように書き換えられないのだろうかということ。
printf("車のナンバーは%d,ガソリン量は%fです。\n",*pC.num,*pC.gas);
pCは構造体Carへのポインタより、*pCは構造体pCのインスタンスを指すはず。
そうするとアロー演算子ではなく、通常通りドット演算子でメンバ変数に
アクセスできると考えた。
実行するとxcodeが次のようなエラーを吐いた。
Member type 'Car *' is a pointer, maybe you meant to use '->'?
Indirection requires pointer operand('int' invalid).
そういう風に規定されてるから仕方ないのかな。