• 締切済み

ハンドル、アドレス、ポインターについて。

質問失礼します。 VB2005においてプログラミングをしようしているのですが、作っている途中で用語に躓いてしまいました。 ハンドル、アドレス、ポインタというのは具体的に何を表すのでしょうか? 自分が使うプログラムのコードを確認していて、GCHandleという構造体を見つけました。 これを理解するにはハンドル、アドレス、ポインタの理解が必要だと聞いたのですが、さっぱりわかりません。 幸いGCHandleについては、「勝手に処理されないようにするために必要なんだな」くらいのことは理解しましたが、ハンドル、アドレス、ポインタの概念を理解できていないせいか、その程度の理解で終わってしまいます。 よろしくお願いいたします。

みんなの回答

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.3

ざっくりとしたイメージとして、 メモリの中身をイメージしてください といっても難しいので マトリックスの流れる数字、 ずらっと数字の羅列のイメージでいいです 判りやすく、円周率の数字がずらっとあるのを イメージしましょう 3.141592653589793238462643383279502884197169399375105820974944 円周率の、少数点以下 25桁目といわれた場合、 ココ!! って指を指し示す=ポインタ、 25桁目、の25って言うのがアドレスです。 次の桁といった場合、ポインタを1つ次へずらす、 アドレスであれば、26桁目なので、26 と表現する ポインタには通常型が存在し、たとえば、5桁で1つのまとまりの 場合は、ポインタを1つ次へずらす事は、 アドレスであれば、25桁目 -> 30桁目に移動する事となります つまりポインタは、メモリ上にある指定されたひとかたまり型の 先頭のアドレスの事をいい Integer 型なら 4 Byteで1かたまりの型 BYTE 型なら 1 Byte で1かたまりの型、 構造体、クラス、関数であれば、それで1かたまりの型となり その先頭のメモリのアドレス を指し示すものをポインタと言います ハンドルとは、ポインタで指し示したメモリの中身の話になりますが たとえば、ファイルであれば、 ファイルをオープンする ファイルを読込む ファイルに値を書き込む ファイルをクローズする それぞれが別々の関数として存在するのですが 一連の作業では、同じメモリ領域を必要とします なので、たとえばオープンする関数で、共有するポインタを取得、 或いは作成し、その共有のポインタを引数としてもらう事で、 読込む、或いは書き込む為のファイルの情報が格納されたメモリ を取得、処理をして、 最後にクローズする関数で共有しているメモリを解放します この一連の共有するポインタ(の中身の事)をハンドルと言い ファイルであれば、ファイルハンドルと言ったりします。

sirokami732
質問者

お礼

非常にわかりやすい回答をありがとうございました! なんとか先に進めそうです!

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>C言語上というお話ではありますが、 すみません、C言語のカテゴリと 間違って回答しておりました。 >それはVisual Basicにおいても同じであるのでしょうか? 参照渡し、値渡しといった部分はVBでも ByRefやByValというように存在します。 内部の実装は異なると思いますが。 機能的な差異はほとんどありません。 C言語と違うのはメモリの確保解放の管理を ”絶対にプログラマが管理しなければならないか” という違いです。 アドレスについても基本的には メモリの番地を示す用語なので、 言語を問わず、基本的に共通です。 ハンドル型というのはそもそも、 プログラム的にどの型が必要かということを 明確にしているに過ぎません。 オブジェクトの”型”という概念を持つ言語において、 そのように扱うという位置づけなので、概念としては 言語を問わないと思います。 逆に変数がどんな値も格納できてしまう言語では、 このような概念は存在しません。 #何でも渡せるので区別する必要がありません。

sirokami732
質問者

お礼

返事が遅れ申し訳ありません。 このあたりはあまり言語に拠らないのですね。 わざわざありがとうございました。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

ポインタとはC言語上での変数への参照を実装するための概念で ポインタ型とは特定の変数型などから派生することができ、 参照先の実体を表す事のできる値を持つオブジェクトのことを言います。 C言語では、この「実体を表す事のできる値」としてアドレスが使用され、 「参照渡し」は存在せず、アドレスを「値渡し」することで、 参照が実装されています。 アドレスとは、メモリの番地、或いは、特定の領域を表す値として、 「アドレス」という言葉が用いられます。 C言語では、アドレス定数、またはアドレス演算子によって、 この値を表現することができます。 ハンドルとは、C言語においては特定の型情報のみを外部に公開する為の手段です。 故に、その中身がポインタであるか、構造体であるか、 またはint型などの数値であるかは実装によって異なります。 車のハンドルと同じで、コントロールする為に必要なものを指しています。 その実装において制御する為に必要な情報をハンドルと呼んでいるに過ぎません。

sirokami732
質問者

お礼

ありがとうございます。 C言語上というお話ではありますが、それはVisual Basicにおいても同じであるのでしょうか?

関連するQ&A