プロが教えるわが家の防犯対策術!

#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
になると思いました。
どこを勘違いしていてどう考え直せばよいか教えて下さい。

A 回答 (4件)

No3 encyです。



え~と。。。ひょっとして試されちゃったのかな?私ったら…(?)

ま、それはさておき、一点だけ確認させてください。

sizeof( char* ) はいくつですか?

基本的には、このサイズの2倍分増えるはずなんですけど。。。

ちなみに、私の手元にある環境では、+8 になりましたよ。

# [私の環境]
# OS: WindowsXP SP2
# コンパイラ: Borland C++ 5.5.1 for Win32
    • good
    • 0
この回答へのお礼

理由を知りたかったです。
ぼくにはなぜそうなのか分かりませんでした。
ありがとうございました。

お礼日時:2006/03/31 22:17

結果は +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バイト分アドレスが進むことになるんです。

こんな感じでいかがでしょうか。
    • good
    • 0
この回答へのお礼

僕が予想した
4 pp6660000, ++pp6660004
は間違っていましたが、結果は
4 pp6660000, ++pp6660008
でもありませんでした。
まだこの回答が全部理解できていませんがこれだけ投稿しておきます。
ありがとうございました。

お礼日時:2006/03/27 18:46

こういうのだと理解しやすいかも。


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)だけ移動する事になります。

参考URL:http://www.st.rim.or.jp/~phinloda/cqa/cqa3.html
    • good
    • 0

> 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になるはずだと思いませんか?

補足日時:2006/03/25 18:59
    • good
    • 0

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