重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

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

C言語のポインタのキャストについて
int *p;
char a[sizeof *p];
*(char**)&p = x;

(char*)p ではなぜ左辺値にならないのかを教えて下さい。

質問者からの補足コメント

  • ごめんなさい。文法ミスです。x は aです。

      補足日時:2018/12/26 13:12
  • 回答ありがとうございます。
    以前この手の質問をした際、下記のプログラムを分かりやすく説明するために書かれているのが質問に書いたプログラムです。

    int tbl[3][3] = { {10, 20, 30}, { 40, 50, 60}, {70, 80, 90} };
    int *p_tbl;
    *(int (**)[3])&p_tbl = tbl;

      補足日時:2018/12/26 14:36
  • 他の回答者によると、
    p は int* 型ですが、これがもしも char * 型だったとすれば a(つまり &a[0])を代入することが出来ます。

    でも、(char*)p では駄目。左辺値にならないからです。代入式の左辺には置けません。int a;a = 10; は良いけれども、10 = a; は駄目。(int)10 = a; も当然駄目です。

    そこで &p とします。つまり、変数 p のアドレスです。

    これに対して (char**) のキャスト演算子を適用します。更に * 演算子を適用。*(char**)&p となります。これなら立派な左辺値となります。
    それを応用したプログラムが上記になります。

    とのことです。

      補足日時:2018/12/26 14:37
  • この説明の左辺値にならないというところが理解ができません。
    もっと言えば普通に(int (*)[3])でキャストするだけではなぜ駄目なのかもわかりません。

    長くなりましたが、この辺りの解説もお願いできますでしょうか?

      補足日時:2018/12/26 14:37
  • 何度もすいません。
    左辺値はキャストできないので、int *のp_tblのアドレスを(int(**)[3])でキャストして*( )で中身を参照しp_tblの(int(*)[3])で代入ができるという感じの考え方になるのでしょうか?

      補足日時:2018/12/26 17:34

A 回答 (4件)

>int *のp_tblのアドレスを(int(**)[3])でキャストして*( )で中身を参照しp_tblの(int(*)[3])で代入ができるという感じの考え方になるのでしょうか?



そうですね
そうすることでtblの先頭アドレスが代入できるということです
tblのアドレスはint(*)[3]なのでそれにあわせたということです

キャストのみでは左辺値にできないので
キャストしたものを間接参照演算子を使うことで代入しているわけです
    • good
    • 1

>p は int* 型ですが、これがもしも char * 型だったとすれば a(つまり &a[0])を代入することが出来ます。


細かいことを言うと、int*のままでもは代入はできます
もちろん警告は出ますがエラーにはなりません
まぁ、それは置いておいて

>この説明の左辺値にならないというところが理解ができません。
そういうものだと思ってください
C言語の場合、キャスト演算子は左辺値にはなりません
https://www.ibm.com/support/knowledgecenter/ja/s …

>もっと言えば普通に(int (*)[3])でキャストするだけではなぜ駄目なのかもわかりません。
上記の通り、キャスト演算子は左辺値にはならないので
キャストするだけではダメです
    • good
    • 1

>ごめんなさい。

文法ミスです。x は aです。
そうでしたか
そもそもなのですが
左辺値をキャストする意味が分かりませんが...

(char*)pの場合は
pが指しているアドレスをchar*として扱うという意味になりますが

*(char**)&pは
pの領域のアドレス(&p)、つまりはint*のアドレスなのでint**になりますが
それをchar**として扱い、*()の部分がそのアドレスが指し示す値を参照する形になっていますので

(char*)pとは全く別の意味になると思いますよ

自信はありませんが...

左辺のキャストはc++だとエラーになると思いますし
Cでも状況では警告、gccのバージョンによってはエラーになると思います
    • good
    • 1

xはどこからでてきたのですか?

    • good
    • 1

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