アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2006/04/04 04:25

参考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さんの回答から導き出せると思いますが…いかがでしょうか?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=2050942
    • good
    • 0
この回答へのお礼

sizeof( char* ) は4であると質問に書いていたので分かってもらえると思って改めて書きませんでした。

+8 は「違う」については僕が間違っていました。+8が正解でした。
学習用に与えられたコンパイラ自体にエラーがあったので色々な勘違いをしていました。

お礼日時:2006/04/04 04:31

こういう質問の時は、こうなるつもりだったのが、どうなったのかを書いたほうがいい答えが出ると思います。



ポインタの大きさが4バイトだとします。

char *pp[3]; の場合はcharへのポインタ3個ですよね。ですから大きさは12バイトです。

char *(*pp)[3]; は、charへのポインタ3個(12バイトの大きさのデータ)へのポインタですから、ppを1個増やせば、その値は12増えます。
    • good
    • 0
この回答へのお礼

答えも知りたかったです。ありがとうございました。

お礼日時:2006/04/04 04:26

複雑な型については、typedef してやるとわかりやすくなります。

    • good
    • 0

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