C言語入門(17) 様々な所で使われているポインターの意味

Posted: 2012年12月03日

様々な箇所で使用されているポインターの意味がわかれば
その処理を正しく実装ができる
ポインターをわかっていてもそのポインターの意味するものを間違えると
損している場合もあるのでここで押さえていきたい!!
例えば、FILE*とか
詳しくは把握していないので推論しか書いていませんが・・・

FILE

FILE*は何を表しているか
libio.hに存在する定義を見てみると構造体の内容が記述されています。
環境ごとに異なると思いますので多少温かい目で見てください

プログラムプログラム:

struct _IO_FILE {
  int _flags;       /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags

  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* 現在ファイルを読み込みをしている位置 (ファイルポインター)*/
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* ファイル読み込み開始位置 */
  char* _IO_write_base; /* ファイル書き込み開始位置 */
  char* _IO_write_ptr;  /* 現在ファイルを書き込みをしている位置 */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* バッファの位置(先頭アドレス) */
  char* _IO_buf_end;    /* バッファの位置(終了アドレス) */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;  /*現在のファイルは何番目にオープンされたか(=ファイルディスクリプタ)*/
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */

#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  /*  char* _save_gptr;  char* _save_egptr; */

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

FILE構造体の
_IO_read_baseがファイルの開始位置
_IO_read_ptrがファイルの読み込み位置
 fgetc()を行った場合読み込める文字の位置
 例)_IO_read_ptrが_IO_read_ptr+1の場合2文字目の文字が読み込める
gccの場合読み込みと書き込みは、別の構造体変数で定義されている。
読み書きモードで開いた場合は、どぉなるんだろうか・・・
フラグを見てfgetc,fputcなどが頑張ってくれているんだろうか?

FILEはchainを持っているためリンクリスト構造で構成されていそう
OSがFILEの情報を保持して、fopenでそのファイルのアドレスを返していくれているんだろうか

HWND

ハンドルのためあまりポインタらしくありませんが
実は、ウィンドウ情報構造体のアドレスが入っている。

OSはどのウィンドウか識別するための構造を保持しており
ウィンドウ操作関数にウィンドウハンドルを渡すことで、目的のウィンドウを操作することができます。

つまり、HWNDに関しては、IDと捉えても問題ないですし
それ以上詮索ができないし、してはいけいない不可侵領域だということ!!

HWND以外のHANDLE系は大体がそういうことになるのかな
雑学程度に覚えておくのも〜

HINSTANCE,HMODULE

Windows GUIを構築する際のエントリーポイント(WinMain)で出てくる型(HINSTANCE)
GetModuleHandleの返却値(HMODULE)
どちらもやはりポインターである
また、HWNDと同様にOSが管理している情報のため
関わらないほうがいい情報でもあったりする(IDと捉える)

HINSTANCEは、実行ファイル(EXE)のアドレスを格納していたらしいが、プロセスごとにメモリー領域を区切られるようになったため
 それ以降は、モジュールの先頭アドレスになりました。
 その理由としては、モジュールの先頭アドレスからモジュールの情報(データセグメント)を読み取るためのようです。
HMODULEは、DLLのアドレスのためモジュールの先頭アドレスです。
 DLLは、単一のインスタンスしか構築されないため

HMODULEとHINSTANCEは、メモリ上にマップされたモジュールの先頭アドレスを指す。
ほぼ内容は拝借しましたが、詳細は参考サイトをごらんください。

参考サイト:http://whileimautomaton.net/2004/12/31234200

カテゴリー: プログラム, 入門 | タグ: , , | コメント無し »

コメント