• ベストアンサー

ポインタが指す構造体メンバの値の表示について

ポインタが指す構造体メンバの値の表示について 下記のプログラムの*pは、saのエイリアスで、pが指すオブジェクトのメンバxは(*p)..xと表示されているが、*p.xまたは、*(p.x)は、文法的正しくないと書かれいる本が多いのでその理由を教えて頂きたい。 ****************************************************************** int main(void) { struct xyz { int x ; long y ; double z; } sa = {50, 99999999L ,3.14}; struct xyz *p =&sa; printf("(*p).x %d\n", (*p).x);

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

メンバアクセスの「.」演算子の左オペランドは構造体または共用体オブジェクトである必要があります. p がポインタなので, x の型によらず p.x は文法エラー.

dreamsturb
質問者

お礼

回答ありがとうございます。メンバアクセスの「.」演算子の左オペランドは、 オブジェクトであることがわかりました。

その他の回答 (4)

  • TERABIT
  • ベストアンサー率44% (4/9)
回答No.5

そのとおり。

dreamsturb
質問者

お礼

回答ありがとうごさいました。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

そんなに多いですか? ちなみに、この場合、xがintなので、「文法的に正しくない」といえますが、xがvoid*以外のポインタ型であるならば、文法的には正しいです。 例、あるいは記述としてあまり適切ではないようにも思えますが、そんな本がそんなに多いのでしょうか?

dreamsturb
質問者

お礼

回答ありがとうございます。そんなに多くありませんでした。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

その理由は, まさに「文法的に正しくない」から. あるいは, 「それを正しいとする文法になってない」から.

dreamsturb
質問者

お礼

回答ありがとうございます。

  • TERABIT
  • ベストアンサー率44% (4/9)
回答No.1

>文法的正しくないと書かれいる本が多いのでその理由を教えて頂きたい。 p が、構造体のポインタであるから、 ポインタである場合は、p->x の様に書かなければいけないから。 *p.x と、*(p.x) は同じ意味であることはわかってますよね・・・ 結びつきの優先順位が、'.' が優先されるから。 だから、(*p) として、構造体の実体に対して (*p).x してます。

dreamsturb
質問者

お礼

回答ありがとうございます。 下記の考え方でよろしいでしょうか (1) *p.x と、*(p.x) は同じ意味であることは、優先順位が、'.' が優先される ので同じ意味とわかります。 (2) ポインタである場合は、p->x の様に書かなければいけないので    構造体の実体を見るため、sa のエイリアスの(*p)とし、メンバーx    を見るため(*p).x とした。

関連するQ&A

専門家に質問してみよう