
No.4ベストアンサー
- 回答日時:
>int *のp_tblのアドレスを(int(**)[3])でキャストして*( )で中身を参照しp_tblの(int(*)[3])で代入ができるという感じの考え方になるのでしょうか?
そうですね
そうすることでtblの先頭アドレスが代入できるということです
tblのアドレスはint(*)[3]なのでそれにあわせたということです
キャストのみでは左辺値にできないので
キャストしたものを間接参照演算子を使うことで代入しているわけです
No.3
- 回答日時:
>p は int* 型ですが、これがもしも char * 型だったとすれば a(つまり &a[0])を代入することが出来ます。
細かいことを言うと、int*のままでもは代入はできます
もちろん警告は出ますがエラーにはなりません
まぁ、それは置いておいて
>この説明の左辺値にならないというところが理解ができません。
そういうものだと思ってください
C言語の場合、キャスト演算子は左辺値にはなりません
https://www.ibm.com/support/knowledgecenter/ja/s …
>もっと言えば普通に(int (*)[3])でキャストするだけではなぜ駄目なのかもわかりません。
上記の通り、キャスト演算子は左辺値にはならないので
キャストするだけではダメです
No.2
- 回答日時:
>ごめんなさい。
文法ミスです。x は aです。そうでしたか
そもそもなのですが
左辺値をキャストする意味が分かりませんが...
(char*)pの場合は
pが指しているアドレスをchar*として扱うという意味になりますが
*(char**)&pは
pの領域のアドレス(&p)、つまりはint*のアドレスなのでint**になりますが
それをchar**として扱い、*()の部分がそのアドレスが指し示す値を参照する形になっていますので
(char*)pとは全く別の意味になると思いますよ
自信はありませんが...
左辺のキャストはc++だとエラーになると思いますし
Cでも状況では警告、gccのバージョンによってはエラーになると思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DIGAの録画データをパソコンに...
-
給食の時の放送
-
日曜今の時間 地上波ろくなも...
-
霊現象で、「髪の毛の束」が見...
-
日テレ「だいすき」の中で使用...
-
遥洋子さんは何故テレビに出な...
-
ゴゴスマの天気予報中に流れるB...
-
カルミナブラーナの歌詞の読み...
-
「youは何しに日本へ」って、海...
-
昨日のアンビリーバボーに出て...
-
レコプラで放送中番組の視聴が...
-
正月のさんまとキムタクが出て...
-
東京ディズニーランドで親切な...
-
愛の貧乏脱出大作戦のスフレ
-
マジックの失敗?演出?
-
カンブリア宮殿
-
NHK「クローズアップ現代」のや...
-
「お」と「を」の教え方
-
テレビ番組
-
3月14日土曜日 NHK マサカメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DIGAの録画データをパソコンに...
-
「行列のできる法律相談所」で...
-
「七日」は「なのか」それとも...
-
教育テレビの番組なのですが...
-
おもいっきりテレビの高橋佳代...
-
遥洋子さんは何故テレビに出な...
-
YouTube (ユーチューブ)の利...
-
吉森こずえさんは今
-
「温泉へGO!」 薫と武藤さん...
-
「youは何しに日本へ」って、海...
-
昔の歌番組でのおっぱいポロリ
-
霊現象で、「髪の毛の束」が見...
-
下ネタがつまらない
-
稲川淳二の「生き人形」って本...
-
給食の時の放送
-
グループ名に「さん」は正しい...
-
予約(約束した)時間の何分前...
-
過激なドッキリ番組について 古...
-
坂下千里子が嫌いです。いろい...
-
テレビ
おすすめ情報
ごめんなさい。文法ミスです。x は aです。
回答ありがとうございます。
以前この手の質問をした際、下記のプログラムを分かりやすく説明するために書かれているのが質問に書いたプログラムです。
int tbl[3][3] = { {10, 20, 30}, { 40, 50, 60}, {70, 80, 90} };
int *p_tbl;
*(int (**)[3])&p_tbl = tbl;
他の回答者によると、
p は int* 型ですが、これがもしも char * 型だったとすれば a(つまり &a[0])を代入することが出来ます。
でも、(char*)p では駄目。左辺値にならないからです。代入式の左辺には置けません。int a;a = 10; は良いけれども、10 = a; は駄目。(int)10 = a; も当然駄目です。
そこで &p とします。つまり、変数 p のアドレスです。
これに対して (char**) のキャスト演算子を適用します。更に * 演算子を適用。*(char**)&p となります。これなら立派な左辺値となります。
それを応用したプログラムが上記になります。
とのことです。
この説明の左辺値にならないというところが理解ができません。
もっと言えば普通に(int (*)[3])でキャストするだけではなぜ駄目なのかもわかりません。
長くなりましたが、この辺りの解説もお願いできますでしょうか?
何度もすいません。
左辺値はキャストできないので、int *のp_tblのアドレスを(int(**)[3])でキャストして*( )で中身を参照しp_tblの(int(*)[3])で代入ができるという感じの考え方になるのでしょうか?