同一のアドレスを示すポインタについて
環境:WindowsXP、VC.NET、MFC不使用
DIBを使うプログラムを作っています。
DIBとは直接関係の無い質問内容かもしれませんがお願いします。
//グローバル変数
LPBITMAPINFO lpInfo;
LPBYTE lpBuff;
LPBYTE lpBit;
//ウインドウプロシージャ内
case WM_CREATE:
// 必要なメモリをまとめて確保
lpBuff=(LPBYTE)GlobalAlloc(GPTR,sizeof(BITMAPINFO)+128*128*3);
//BitmapInfoのアドレスを設定
lpInfo=(LPBITMAPINFO)lpBuff;
//画像データのアドレスを設定
lpBit=(LPBYTE)(lpBuff+sizeof(BITMAPINFO));//<-----(1)
これをデバックで見ると
lpBuff 0x00145400""
lpInfo 0x00145400
lpBit 0x0014542c""
となっていました
lpBuffとlpInfoは同じアドレスなので(1)を
lpBit=(LPBYTE)(lpInfo+sizeof(BITMAPINFO));//<----(2)
と書き換えて見たのですがデバッカだと
lpBuff 0x00145400""
lpInfo 0x00145400
lpBit 0x00145b90""
となり、lpBitのアドレスが最初と異なり、メモリのエラーが発生しました
lpBuffとlpInfoは同一のアドレスを示すため、
(1)と(2)は同じ動作をする思っていたのですが違うのでしょうか?
また、アドレスの後部に付いている""はどういった意味なのでしょうか?
よろしくお願いします。
> //グローバル変数
> LPBITMAPINFO lpInfo;
> LPBYTE lpBuff;
> LPBYTE lpBit;
だから,
> //画像データのアドレスを設定
> lpBit=(LPBYTE)(lpBuff+sizeof(BITMAPINFO));//<-----(1)
は,
lpBit = &(lpBuff[sizeof(BITMAPINFO)]);
と,
> lpBit=(LPBYTE)(lpInfo+sizeof(BITMAPINFO));//<----(2)
は,
lpBit = &(lpInfo[sizeof(BITMAPINFO)]);
と同じです。
lpInfoはBITMAPINFO *型だから,
アドレス値はsizeof(BITMAPINFO) * sizeof(BITMAPINFO)だけ先に進みます。
lpBit = (LPBYTE)lpInfo + sizeof(BITMAPINFO);
とか,
lpBit = ((LPBYTE)lpInfo) + sizeof(BITMAPINFO);
なんてやれば,(1)と同じ動作をします。
ポインタに型があることをちゃんと認識して下さい。
> lpBuffとlpInfoは同一のアドレスを示すため、
> (1)と(2)は同じ動作をする思っていたのですが違うのでしょうか?
違います。
> また、アドレスの後部に付いている""はどういった意味なのでしょうか?
char * / signed char * / unsigned char *型(とwchar_t *型もかな?)に関して,
文字列とみなして中身を表示しています。
ご教授有難う御座います
lpBit=(LPBYTE)(lpInfo + sizeof(BITMAPINFO));
これを
lpInfoのアドレスにsizeof(BITMAPINFO)をプラスする
と思っていたのが間違いで
実際は
lpInfoのアドレスからlpInfoのサイズ*sizeof(BITMAPINFO)分アドレスを
移動させると考えるべきでした
分かりやすいご説明有難う御座いました。