#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
になると思いました。
どこを勘違いしていてどう考え直せばよいか教えて下さい。
No.1ベストアンサー
- 回答日時:
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;
}
No.4
- 回答日時:
参考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
sizeof( char* ) は4であると質問に書いていたので分かってもらえると思って改めて書きませんでした。
+8 は「違う」については僕が間違っていました。+8が正解でした。
学習用に与えられたコンパイラ自体にエラーがあったので色々な勘違いをしていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- ドラマ 興味ありますか? 1 2023/07/19 14:05
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- その他(ホビー) TOMIXの踊り子の特急シンボルマーク(小)PP−200を探してるが あいにく売り切れのようだ。 ど 2 2023/06/04 19:02
- 相撲 この動画の最初に出てくる行司は誰ですか? https://m.youtube.com/watch?v 1 2022/06/10 21:00
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
ExcelVBAでのkernel32(64bit)
-
Run-Time Check Failure #3とい...
-
NULLとブランクの違い
-
関数ポインタの高速化のメリット
-
Cで作成したDLL関数をVBから呼...
-
main(int argc,char **argv[])...
-
LPSTR型の初期化について
-
C言語のポインタに直接アドレス...
-
アプリを32bitから64bit移行
-
ハンドル、アドレス、ポインタ...
-
CWnd::EnableWindow()の扱い方
-
#define NULL ((void *)0) の弊害
-
C言語でのconstを返す関数
-
C言語の関数と配列に関する質問
-
C++で関数ポインタから関数名を...
-
関数ポインタの利点
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
セグメントエラー
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
DLL<->VB間での受け渡し(文字...
-
C言語でのconstを返す関数
-
ポインタについて
-
参照型で受け取った引数をポイ...
-
TCHAR文字列内の検索について
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
おすすめ情報