電子書籍の厳選無料作品が豊富!

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

下記のプログラムの*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);

A 回答 (5件)

メンバアクセスの「.」演算子の左オペランドは構造体または共用体オブジェクトである必要があります.


p がポインタなので, x の型によらず p.x は文法エラー.
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/28 07:35

そのとおり。

    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/28 07:38

そんなに多いですか?


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

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

お礼日時:2009/03/28 07:37

その理由は, まさに「文法的に正しくない」から.


あるいは, 「それを正しいとする文法になってない」から.
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/28 07:40

>文法的正しくないと書かれいる本が多いのでその理由を教えて頂きたい。



p が、構造体のポインタであるから、
ポインタである場合は、p->x の様に書かなければいけないから。

*p.x と、*(p.x) は同じ意味であることはわかってますよね・・・
結びつきの優先順位が、'.' が優先されるから。

だから、(*p) として、構造体の実体に対して (*p).x してます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/27 11:05

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