• 締切済み

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

質問失礼します。 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

  • ポインタについての良いテキストを探しています。

    ポインタ完全制覇、秘伝問答ポインタ編は読了しました。 しかし、ダブルポインタ(便宜上こう書きますが、ポインタのポインタのことです)や トリプルポインタが出てくると、いきなり分からなくなってしまいます。 アドレスと値の関係を図解してみても、なぜこんな風にする必要があるのだろう?その必然性は? となってしまい、本質的な理解ができていないと感じています。 関数に渡すときの値渡しと参照渡しについては理解できているつもりです。 ですが、それに、構造体や、構造体のメンバーに文字列がある場合、mallocなどが関わってくると ゴチャゴチャになっていきなり分からなくなってしまいます。 上記の本は、文字列と配列とポインタあたりは解説してあり、そのあたりは理解しているつもりなのですが、ダブルポインタやトリプルポインタについては明確な記載がありません。 以前の質問で、 http://okwave.jp/qa/q6478987.html >3次元の構造を持つなら 3次元配列が必要であり, それを動的に確保しようとしたら「ポインタのポインタのポインタ」は自然な発想だと思う. とご回答を頂いたことがあるのですが、"自然に"だけでなくじっくり考えても理解できていません。 その他のご回答もなぜそのような状況でそのようなポインタの使い方が必要になるのかなど理解出来ないところが多いです。 基礎が大事だというのは十分理解しているつもりですが、 基礎だけでなく、その上のレベルでのポインタの解説や勉強に役立つテキストを教えてください。 なにとぞよろしくお願いいたします。 また、所要のため土日はネットに繋ぐことができませんのでお返事が遅れることをご了承ください。

  • C言語のポインタとスタックポインタ

    プログラム始めて1ヶ月の初心者です。 C言語のポインタとスタックポインタというのは同じなのでしょうか。 スタックポインタの考えは大体理解出来たのですが C言語のポインタとなるとコードを見てもサッパリ分かりません。 ネットで調べても出てこなかったのでどなたか教えて下さい。 よろしくお願いします。

  • ポインタのアドレスの不変的な性質?

    最近奇妙な現象?に遭遇しました。 理解している人には笑われるかもしれませんが・・・・ ソースを以下に示します。 #include <stdio.h> void function(int *pointer); void main(){ int sample=3; int *pointer; pointer=&sample; function(pointer); printf("%d\n", *pointer); } void function(int *pointer){ int temp=9; pointer = &temp; } 今上のソースとは別のプログラムを作成中で、上のような状態になっています。関数にポインタのアドレスを渡し、関数の中でアドレスを書き換えて表示を違うものにしようと考えました。 上の表示結果は3になります。なぜなのでしょう? そして目的を達したいため、上のように関数内でのアドレスの書き換えが呼び出し側に反映されるようにすることができないでしょうか? 分かる方はよろしくお願いします。

  • ポインタ変数とポインタのポインタ

    ポインタ変数の宣言 char *a[]; をしたとき僕の中では a[0],a[1]...という、ある文字列A,B,C...の最初のアドレスを指すポインタが、配列になっているものを宣言していると理解していました。 しかしこの次に、ポインタのポインタが出てきました。僕はこれを、 ある変数を指し示すアドレスのアドレスである、と理解しました。 この2つは1つめはいくつかのアドレスを指し示すもの、2つ目は1つのアドレスを指し示すものであるとして、僕の中で異なったものであると理解していましたが、参考書「C標準コースウェア」によると プログラムにおいて、関数でポインタ配列を受け取るときchar *p[]はchar **pとしてもよい と書かれており、またその実例として、 (9-5) #include <stdio.h> void disp (char *p[],int n){ int i; for (i= 1;i<n;i++){ printf("%s\n",p[i]); } } int main(void){ char *girl[] = {"Arica","Candy","Lisa"}; disp (girl,sizeof(girl)/sizeof(girl[0])); return 0; } というプログラムが書かれていました。 ここで一気に訳が分からなくなりました。 char *girl[] = {"Arica","Candy","Lisa"}; と宣言されているため、 girl[0]はAricaという文字列の最初のアドレスを指すポインタ、 *girl[0]はAricaという文字列を直接指し示していると解釈しています。 girlは{"Arica","Candy","Lisa"}という文字列の配列の最初のアドレスを指し示していると考えました。 sizeof(girl)を使った時に不思議なのですが、 girlはどのように配列の終わりを理解しているのでしょうか? (配列の要素数を渡していない点が不思議です。) また、 disp側が受け取ったのは*girl[]であり、いくつかのポインタの配列ですが、渡したものはgirlという要素数がないポインタ1つだけです。 そして最初の疑問が出てくるわけですが、*p[]を**pと書きかえてみると、 文字列のアドレスを示すgirlという名の1つのポインタを渡すと、pという名のポインタのポインタで受け取るというのも、よくわからなくなっています。 おそらくポインタ配列に対する理解がどこかでずれているようですが、自分でどこがわからないのかわからなくなっています。 どうかご教授ください。

  • ポインタについてアドバイスお願いします。

    C言語の初心者です。 参考書でも書かれている事があるのですが、経験豊富な方でもポインタについて知ってるようで知ってないということがあります。って読んだことがあります。 実際、ポインタの必要性とはどのような時に必要なのでしょうか?? アドレス指定と言う風に、はじめはこの様な理解から入ると習いましたが、私には配列で十分間に合うのでは??って思っちゃうのです。 構造体の出力、アドレスの入れ替え、こんなときには便利なのかもしれませんが、C言語をやる上で絶対に必要・・、いったいなぜ??って考えちゃいます。 初心者なのに生意気な事言ってしまってもうしわけございません。 以前、私もそんな感じで悩んだ事あるって方がいらっしゃいましたら、ポインタとはこんな感じの時に初めて必要だと思うのだ!とご教授お願いいたします。 この様な質問に対しても、笑って答えてくださるような プロフェッショナルの方や、一般の凄い方のアドバイス、お待ちいたしております。 宜しくお願いいたします。

  • Cポインタについて

    ある本の中のソースコードをながめていましたら、 (int*)&変数といったコードがありました。 これはどういった処理になっているのでしょうか? ポインタは理解しているつもりだったのですが、 本を調べてもこういう形式のものは記載されていませんでした。 わかりやくす、よろしくお願いします。

  • 関数ポインタの利点

    こんにちは。 C言語初心者ですが今勉強中です。 その中でポインタについては理解できたのですが、 関数ポインタの利点、使うべき所などが理解できません。 ポインタの基本は理解しています。 値渡し、アドレス渡しも理解しています。 関数ポインタを使うと何がいい、またはどんなとき使わなければならないのか 教本を読んでいてもさっぱりわかりません。 サンプルプログラムを打っても何のために使ってるのかわからないです。 どなたか教えていただけませんでしょうか? よろしくお願いします。

  • ツールバー等コントロールのグラフィカルな部分のコード

    例えばツールバーやテキストボックスやチェックボックス等のコントロールを自作しようとするとそれがどのような見た目なのかをコーディングする必要がありますよね? ポインタが乗ると立体的に見えるようにするとか、鉛筆で書いたチェックのようなものを描画するとか。 僕はプログラミングに関しては文法や概念を本などで学んだだけで実際のプログラムなんかはほぼ書いたことがありませんが、データを処理するといったプログラムや関してはどういったことをするのかはなんとなくは理解出来ます。 でも先述したようなコントロールの描画、というかそもそもの見た目を規定しているコードというのはどういうものか想像もつきません。 ありえそうにありませんが、画像などのリソースを使ってるわけではないですよね? 簡単な、出来ればある程度詳しい説明か、そういった部分に関して参考になるサイトや書籍やオープンソースのプログラムなどがあれば教えてください。

  • ポインタ

    long ToLittleEndian(char *a,long bytesize){ long i; char lb; char hb; long lsize; lsize=bytesize/2; for (i=0;i<lsize;i++){ hb=*(a++); lb=*(a--); *(a++)=lb; *(a++)=hb; } return 0; } ポインタのアドレスがはみだすとどうなるのでしょうか? 上記のようなコードの場合、最後の処理でポインタaが1バイト分はみ出してしまいますが、 存在しないアドレスを参照しようとするとエラーになるかと思いますが ポインタを動かすだけだと問題ないのでしょうか? 処理系やコンパイラに依るのでしょうか。 初心者ですがよろしくお願いします。

  • ポインタを使ったプログラムのミスでPCは大丈夫?

    つまらない質問かとは思いますが、よろしくお願いします。 Cを学習している途中のですが 参考書を読み進め、ポインタの概念に関する章まですすみました。 ポインタへの理解を深めるために 簡単なプログラムを作っているのですが。 *p + i と *(p + i) この二つでは動作が違うために コンパイルはできたものの、暴走をしてしまいました。 iの値がどんどん増えていき、*pに何かを代入するようなプログラムだとしたら メモリにどんどん書き込まれていくと思うのですが その際に、インターネットエクスプローラやアウトルックなどの、ソフトを立ち上げていた場合 影響はないのでしょうか? ソフトを立ち上げていなくても、PCが起動している限り 何らかの値がメモリに保存されていると思うのですが (pcには詳しくないので、違っていたらすみません) 暴走したプログラムが、パソコン内部のなにかに影響を及ぼして PCが使えなくなる!壊れてしまう!? なんてことはあるのでしょうか? これからどんどんPCの知識を得ようと思っているので 書籍など読めばいずれはわかるとは思うのですが パソコンの生命が脅かされるほどの問題だったら!? (だとしたら、参考書に危険だよ!と書いてあるとは思いますが^^;) と思うと心配になったので、質問させていただきます よろしくお願いします。

専門家に質問してみよう