• 締切済み

構造体配列のポインタについて(H17春基本情報試験C言語問題)

平成17年春基本情報技術者試験の午後問題の問6について、質問があります。 設問dの答えがイなのですが、これがどうしても理解できません。 関数「int word_width(char *str, CHARPROF *char_list)」の「char_list」は構造体の配列のポインタとして宣言されています。 そしてこの関数内の処理を問う穴埋めdの解答は「*str != char_list[idx].char_p」となっています。 char_listは構造体配列のポインタなので、「char_list[idx]->char_p」あるいは「(*char_list[idx]).char_p」となるのでは?と思ったのですが、選択肢にもそれはありません。 char_list配列の先頭アドレスの中身を見るときは「char_list->char_p」となっても、要素番号がつくと、ポインタとはみなさなくなって「char_list[0].char_p」となるのでしょうか? だとするとポインタ宣言したchar_listとポインタ宣言しなかった場合(「CHARPROF char_list」のように普通に変数宣言?した場合)の「char_list[0].char_p」の違いがよくわからないのですが・・・。 念のため、この関数word_widthと構造体CHARPROFを転記します。 アドバイス、よろしくお願いします。 typedef struct {  char char_p; /* 文字 */  int char_w; /* 文字幅(ポイント数) */ } CHARPROF; int word_width(char *str, CHARPROf *char_list) {  int print_w = 0, idx;  while (*str != '\0') {   for (idx = 0; (ここに穴埋め「d」が入る); idx++);   print_w += char_list[idx].char_w;   str++;   }   return print_w; }

みんなの回答

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

「構造体の配列のポインタ」というのを間違って解釈していませんか・ 「(構造体のポインタ)の配列へのポインタ」ではないですよ。 「(構造体の配列)へのポインタ」です。そして、ここでは「構造体の配列へのポインタ」とは「構造体の先頭要素へのポインタ」のことです。 式とそれに対応するデータ型を一覧にすると、 char_list  ポインタ *char_list  構造体 char_list[idx]  構造体 ( char_list+idx) ポインタ char_list[idx]は構造体なので、要素を取り出すには 「.char_p」を付けます。 (char_list+idx)->char_pと書いても同じですが、char_list[idx].chsr_pと書く方が一般的

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

CHARPROF *char_list (ポインタ) を CHARPROF char_list[] (配列) と考えれば。 TYPE var[COUNT]; var:配列の先頭アドレス var[i]:配列のi番目の“要素”

関連するQ&A