- ベストアンサー
char *(*)[3];について
#include <iostream.h> main(){ char *(*pp)[3]; printf("%lu", sizeof(char*)); printf(" pp%lu", pp); printf(", ++pp%lu", ++pp); } これを実行して 4 pp6660000, ++pp??????? のように表示されたときに、???????の部分が何になるか考えました。 ppはchar[3]を指すポインタのポインタだから、ppをインクリメントすれば、「char[3]を指すポインタ」の大きさだけ大きくなるはずだから、「char[3]を指すポインタ」の大きさである4バイト大きくなるはずだから 4 pp6660000, ++pp6660004 になると思いました。 どこを勘違いしていてどう考え直せばよいか教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
pp は、3コのポインタの配列へのポインタです。 ポインタのサイズが4バイトの時、 pp をインクリメントすると12バイト増えることになります。 例えば、次の様に書くとわかりやすいと思います。 #include <cstdio> using namespace std; // CHAR3 は、3のサイズを持つchar の配列 typedef char CHAR3[3]; int main(){ CHAR3 *pc3;//pc3 は、char[3]を指すポインタ char test[3]; pc3=&test; printf("%p\n",pc3); pc3++; printf("%p\n",pc3);//+3(サイズ分)される CHAR3 **ppc3;//ppc3 は、char[3]を指すポインタのポインタ ppc3=&pc3; printf("%p\n",ppc3); ppc3++; printf("%p\n",ppc3);//+4(ポインタサイズ分)される return 0; }
その他の回答 (3)
- ency
- ベストアンサー率39% (93/238)
参考URL に示したところでも同じ内容の質問をしていますが、そこでは納得がいかなかったということでしょうか。 # 配列要素数が 2→3 となっていることを除いて、同じ内容ですね。 char *(*pp)[2]; の場合、+8 は「違う」とのことでしたが、今回も +12 とは違うんでしょうか? # 「違う」とだけ書いてあって、「どんな結果になった」の部分がなかったので # 「試されたのかなぁ」と思ってしまったんです。 改めて mithscさんにお聞きします。 「sizeof( char* ) はいくつですか?」 # 参考URL のところでも同じ質問をしましたが、答えてくれませんでしたよね? 基本的に、「sizeof( char* ) ×配列要素数」だけアドレスが増えるはずです。 char *(*pp)[2]; なら、「sizeof( char* ) * 2」ですし、 char *(*pp)[3]; なら、「sizeof( char* ) * 3」ということです。 「どうしてそうなる?」の部分は、前回の回答や今回の No1 BLUEPIXYさんの回答から導き出せると思いますが…いかがでしょうか?
お礼
sizeof( char* ) は4であると質問に書いていたので分かってもらえると思って改めて書きませんでした。 +8 は「違う」については僕が間違っていました。+8が正解でした。 学習用に与えられたコンパイラ自体にエラーがあったので色々な勘違いをしていました。
- tadys
- ベストアンサー率40% (856/2135)
こういう質問の時は、こうなるつもりだったのが、どうなったのかを書いたほうがいい答えが出ると思います。 ポインタの大きさが4バイトだとします。 char *pp[3]; の場合はcharへのポインタ3個ですよね。ですから大きさは12バイトです。 char *(*pp)[3]; は、charへのポインタ3個(12バイトの大きさのデータ)へのポインタですから、ppを1個増やせば、その値は12増えます。
お礼
答えも知りたかったです。ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
複雑な型については、typedef してやるとわかりやすくなります。
お礼
ありがとうございました。