- 締切済み
char *(*)[];について
#include <iostream> using namespace std; main(){ char *(*pp)[2]; printf("%lu", sizeof(char*)); printf(" pp%lu", pp); printf(", ++pp%lu", ++pp); } これを実行して 4 pp6660000, ++pp??????? のように表示されたときに、???????の部分が何になるか考えました。 ppはchar[2]を指すポインタのポインタだから、ppをインクリメントすれば、「char[2]を指すポインタ」の大きさだけ大きくなるはずだから、「char[2]を指すポインタ」の大きさである4バイト大きくなるはずだから 4 pp6660000, ++pp6660004 になると思いました。 どこを勘違いしていてどう考え直せばよいか教えて下さい。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ency
- ベストアンサー率39% (93/238)
No3 encyです。 え~と。。。ひょっとして試されちゃったのかな?私ったら…(?) ま、それはさておき、一点だけ確認させてください。 sizeof( char* ) はいくつですか? 基本的には、このサイズの2倍分増えるはずなんですけど。。。 ちなみに、私の手元にある環境では、+8 になりましたよ。 # [私の環境] # OS: WindowsXP SP2 # コンパイラ: Borland C++ 5.5.1 for Win32
- ency
- ベストアンサー率39% (93/238)
結果は +8 されるということで良いですか。 mithsc さんのご質問の中にある以下の箇所がちょっと違っていることになります。 > 「char[2]を指すポインタ」の大きさである4バイト大きくなるはずだから 誤)「char[2] を指すポインタ」 正)「char (*)[2]を指すポインタ」 ですよね。 つまり、pp は「『ポインタの配列』を指すポインタ」です。 配列を指すポインタは、インクリメントすると配列サイズ分アドレスが進みます。 No1 osamuyさんの例をそのまま使わせてもらって、具体的に説明してみます。 # 勝手に使わせてもらってすみません。。。>osamuyさん。 > typedef char *Tcharptr; > typedef Tcharptr Tcharptrarr[2]; > Tcharptrarr *pp; ここで、サイズを確認していきましょう。 sizeof(Tcharptr) ⇒ 4 # 「char型を指すポインタ」のサイズだから 4 ですね。 sizeof(Tcharptrarr) ⇒ 8 # 「ポインタの配列(要素数2)」のサイズだから # 「ポインタのサイズ」×「配列要素数」= 4×2 = 8 ですね。 ということは、pp は「Tcharptrarr を指すポインタ」ですから、++pp は 8バイト分アドレスが進むことになるんです。 こんな感じでいかがでしょうか。
お礼
僕が予想した 4 pp6660000, ++pp6660004 は間違っていましたが、結果は 4 pp6660000, ++pp6660008 でもありませんでした。 まだこの回答が全部理解できていませんがこれだけ投稿しておきます。 ありがとうございました。
- osamuy
- ベストアンサー率42% (1231/2878)
こういうのだと理解しやすいかも。 typedef char *TCharPtrArr[2]; TCharPtrArr a[2]; TCharPtrArr *pp = a; ――で、以下が成り立ちます: *pp == a[0] *(pp + 1) == a[1] p++は、p=p+1ですから、メモリアドレス空間的には、aの要素1個分(i.e. sizeof TCharPtrArr)だけ移動する事になります。
- osamuy
- ベストアンサー率42% (1231/2878)
> char *(*pp)[2]; 分けて書くと、以下のようになります: typedef char *Tcharptr; typedef Tcharptr Tcharptrarr[2]; Tcharptrarr *pp; なので、「char[2]を指すポインタ」のポインタでなく、「char型ポインタ二つ分の配列」のポインタではないかと。 char[2]を指すポインタのポインタなら、こうでは: char ( **p )[2];
補足
日本語が変でしたね。でも、「char型ポインタ二つ分の配列」のポインタということは分かっていました。 やっぱりそのサイズは4で、 4 pp6660000, ++pp6660004 になると思いました。 osamuyさんも6660004になるはずだと思いませんか?
お礼
理由を知りたかったです。 ぼくにはなぜそうなのか分かりませんでした。 ありがとうございました。