#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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No3 encyです。
え~と。。。ひょっとして試されちゃったのかな?私ったら…(?)
ま、それはさておき、一点だけ確認させてください。
sizeof( char* ) はいくつですか?
基本的には、このサイズの2倍分増えるはずなんですけど。。。
ちなみに、私の手元にある環境では、+8 になりましたよ。
# [私の環境]
# OS: WindowsXP SP2
# コンパイラ: Borland C++ 5.5.1 for Win32
No.3
- 回答日時:
結果は +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
でもありませんでした。
まだこの回答が全部理解できていませんがこれだけ投稿しておきます。
ありがとうございました。
No.2
- 回答日時:
こういうのだと理解しやすいかも。
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
No.1
- 回答日時:
> 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になるはずだと思いませんか?
お探しの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ランキング
-
戻り値で構造体を返すことは可...
-
C言語のポインタに直接アドレス...
-
Run-Time Check Failure #3とい...
-
セグメントエラー
-
LPSTR型の初期化について
-
init関数の意味
-
fopne で失敗する原因
-
構造体の中の構造体
-
アプリを32bitから64bit移行
-
NULLとブランクの違い
-
無効なポインタ操作のエラー
-
プーさんのマウスポインタを教...
-
参照型で受け取った引数をポイ...
-
C言語 関数の戻り値と自動変数
-
C言語でのconstを返す関数
-
構造体とfscanf
-
NASMかNASKの文法の本
-
コンストラクタでnewを失敗した...
-
【C言語】戻り値が構造体の関数
-
C言語の関数と配列に関する質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
fopne で失敗する原因
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
Cで作成したDLL関数をVBから呼...
-
関数ポインタの高速化のメリット
-
C言語でのconstを返す関数
-
NULLとブランクの違い
-
C++で関数ポインタから関数名を...
-
ハンドルはポインタか
-
ExcelVBAでのkernel32(64bit)
-
デバイスハンドルとは?
-
【なぜポインタを使うのか】
-
TCHAR文字列内の検索について
おすすめ情報