アプリ版:「スタンプのみでお礼する」機能のリリースについて

平成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 回答 (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と書く方が一般的
    • good
    • 0

CHARPROF *char_list (ポインタ)



CHARPROF char_list[] (配列)
と考えれば。


TYPE var[COUNT];
var:配列の先頭アドレス
var[i]:配列のi番目の“要素”
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!