概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 構造体へのポインタ
2006年10月03日 (火) | 編集 |
ちょっと忙しい日々。しかも始まったばかり。
11月中旬くらいまでは気の休まる暇も無さそうだ。


さて、久し振りにC言語の勉強。

構造体と言えど変数であり、配列である以上はやはりポインタと関わってくる模様。
構造体データを参照するポインタは

struct m_status *p;

と宣言される。structがついただけで他のポインタと変わらんな。
pがm_status型構造体へのポインタ変数になるわけだが、このポインタ変数に前回の構造体配列a[]の先頭アドレスを代入するには、

p=a;

と記述する。これによってポインタ変数pを使って構造体配列a[]を参照することが出来るようになるのだそうだ。

が、構造体は配列よりも複雑に出来ているせいか、専用の演算子を使って参照するなど、少々面倒臭い作りになっている。
例えばpによってa[0].nameを参照したい場合には、

p->name

と記述する。->が構造体(と共用体)のメンバーを参照する専用の演算子なわけだ。
なので

p->str
p->vit
p->agi


でそれぞれa[0].str、a[0].vit、a[0].agiを参照できることになる。また、p++;でポインタを進めると、参照されるそれぞれの値がa[1].str、a[1].vit、a[1].agiになる。

以上で概要終わり。
例によって実際に見てみよう。

#include
void main(void)
{
 int i;
 struct m_status{
  char name[10];
  int str;
  int vit;
  int agi;
 };


 static struct m_status a[]={
  {"隊長",18,15,17},
  {"桐崎",18,18,18},
  {"アリシア",18,19,18},
  {"栃木",18,18,18},
  {"ティー",14,12,24},
  {"ウェル",17,19,18}};


前々回に作った構造体配列だが、これをポインタ変数を使って表示してみる。

 struct m_status *p;
 p=a;

 printf(" Name STR VIT AGI\n");
 for(i=0;i<6;i++){
  printf("%10s %3d %3d %3d\n",p->name,p->str,p->vit,p->agi);
  p++;
 }
}


struct_pointer_test.jpgstruct_pointer_test2.jpg
ポインタを経由しているだけでやっていることは変わらないが


さて、最後の表示の部分だが、ポインタを使って関数にすることも出来る。

void struct_disp(struct m_status *p)
{
 while(p->name!=NULL){
  printf("%10s %3d %3d %3d\n",p->name,p->str,p->vit,p->agi);
  p++;
 }
}


while文でNULLに達するまで、という書式を使っているのは渡された構造体配列の数が確定しているとは限らないからかね。

struct_pointer_test3.jpgstruct_pointer_test4.jpg
こんな感じ

逆に言えば、構造体配列初期化時にNULLを入れておかなくてはならないんだが。
また、while文でp->nameを扱う場合、構造体宣言時のnameは[]ではなく*でないと実行時に大変なことになる模様。理由はよく分からない。後で同僚に聞いてみよう。

まとめ。

相変わらずポインタはよく分からねー

同僚曰く「単なるアドレスを格納できる?変数」らしいけど。
やってることは配列と変わらなくねー?
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。