• ベストアンサー

【VC++.NET】ポインタとは??

VC++.NETを、入門書で勉強しています ぐぐったりしてみたのですが、ポインタというのが、いまいちわかりません。 【質問】ポインタとは、何なのですか?また、どういう時に利用するのですか?利用の仕方も教えていただければ幸いです

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ポインタの基礎をちょっとだけ触ってみましょう。 int num;を宣言し、仮にnum=139;としたとき。 printf("%d", num);の結果が139と表示されるのはご周知のとおりだと思います。 このとき、メモリ上にnumのデータが書き込まれている場所、それをアドレスといいます。 次に、int *p;と宣言したときpというポインタができます。 それでは、このポインタとは何なのか?抽象的にいってしまえば「どこでもドア」といったところでしょうか。 pという「どこでもドア」はこの時点では何にも行き先が指定されていないのでどこにもいけません。それではドラえもんが「numのデータがある場所に行きたい」としたときはp=&num;(&をつける事で&numはnumの場所の情報〔アドレス〕を表す)として「どこでもドア」pにnumまでの行き先を入力します。これで、numの場所までいけるようになりました。 printf("%d", *p);というように、pにアスタリスクを つけるとドアの向こうはnumの値、つまり139がおいてありますのでこの情報をprintf()関数に渡すことになります。139が表示されます。ポインタの型はここではint型だったのでnumの型もint型でなければなりません。 char str[100]="Hello World";といった文字列配列を作ったとき、strというポインタができています。これは既にstr[0]のアドレスをさしています。 printf()関数で文字列を表示させるとき、printf(str);としたらHello Worldと表示されますstrのままだとstrのアドレス情報がprintf()関数に渡され、関数がそのアドレス情報を利用して表示しているのです。 関数などを自分で作ったりするうちにその便利さがわかってきます。長文、失礼しました。 sample.(そのままコンパイルして大丈夫です) #include <stdio.h> int main(void) { float *p, f; f=20.3; p=&f; printf("*p = %f, f = %f\n", *p, f); *p=14.9; /* pを通してfに新たな値を代入する事もできる */ printf("f の値が %f に書き換えられた", f); return 0; }

Natoh
質問者

お礼

とても詳しく説明していただき、ありがとうございました がんばりたいと思います

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ency
  • ベストアンサー率39% (93/238)
回答No.2

ポインタは、一言でいうと次のようになるでしょうか。 「ある型の変数や値の格納されている領域を指し示すためのもの (ポイントするもの = ポインタ)」 要するに、どこにその変数なり値なりが格納されているのか、その情報を持っているものということになります。 ま、実際には「格納されている領域を指し示すためのもの」として「アドレス」が使われているので次のように言い換えても良いと思います。 「ある型の変数や値のアドレス」 もう少し突っ込んで説明してみます。 まず最初に「ポインタ型」という型があります。 ポインタ型はそれだけで存在するのではなくて、「int型へのポインタ型」とか「char型へのポインタ型」というように、int型やchar型など元になる型があって、そこから派生する型です。 ポインタ型はint型やchar型と同じように「型」ですから、ポインタ型の変数とかポインタ型の値があります。 この「int型へのポインタ型」と「char型へのポインタ型」は別の型だということをしっかりと認識しておいてください。 たとえば、 -------------------------------------------------------- int* p_hoge; /* int型へのポインタ */ -------------------------------------------------------- と定義したら、p_hoge は「int型へのポインタ型の変数」になります。 また、次のようにすることでポインタ型の値を取得することができます。 -------------------------------------------------------- int hoge; /* int型の変数 */ int* p_hoge; /* int型へのポインタ */ p_hoge = &hoge; -------------------------------------------------------- &hoge が「int型へのポインタ型」の値になるわけですが、実際にどのような値が設定されているかは、printf() で確認できます。 -------------------------------------------------------- int hoge; /* int型の変数 */ printf( "hogeへのポインタの値=%p\n", &hoge ); -------------------------------------------------------- おそらく 16進数 8桁の数値が表示されると思いますが、ここで表示されている値が「int型へのポインタ型の値」になります。 つまり、hoge という変数が格納されている場所を指すアドレスです。 ちなみに、一般に「ポインタ」といった場合、次の3つのどれかを指していることが多いように思います。 1. ポインタ型 2. ポインタ型の変数 3. ポインタ型の値 さて、実際にプログラミングする場合には、ポインタをアドレスだというふうに考えてプログラミングすることはほとんどないと思います。 ポインタ経由でそれが指している変数なり値なりを参照できる、というように考えることが多いと思います。 上記の例では「*p_hoge とすれば hoge に設定されている値を見ることができる」という感じです。 で、使われ方ですが、一番良く使うのは配列絡みのところでしょうか。 このあたりの説明をしだすと、また長くなりますので詳細は割愛します。 # ここまででも十分長くなっちゃったしねぇ。。。 単純に言うと C では配列を扱うのが苦手なので、関数の引数に配列を渡したい場合には、代わりに「配列の先頭要素へのポインタ」を渡すことになります。 これは C 特有の言語仕様による制約のようなものになりますが、C 言語以外でも使えるものとしては「リスト構造」を作る場合でしょうか。 同じ型の変数を数珠つなぎにリンクしていく構造をリスト構造といっていますが、次の変数にリンクするのにポインタが使われるわけです。 # リスト構造の詳細は、構造体も絡んでくるので割愛します。 こんな感じでいかがでしょうか。 # 長々と失礼しました。

Natoh
質問者

お礼

初心者にもわかりやすく説明していただき、ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
  • ggaogg
  • ベストアンサー率43% (38/88)
回答No.1

Googleで「ポインタ」というワードで検索したら、たくさんでてきましたが。 ゆっくり、いろんなサイトの文章を読めばわかるはずです。。

参考URL:
http://www.google.com/search?hl=ja&q=%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC++.NET2003と2005はどれ位違うものなのですか?

    Visual C++.NETについての質問です。 今度VC++.NETを使うので、勉強しています。 ■PC環境 VC++ 2005 Express Edition ■勉強に使っている本 ひと目でわかるVisual C++.NET Version 2003 アプリケーション開発入門 なのですが、本に書いてある例を参考に打っても時々エラーが起こります。 __gcの部分だったり、get_Now()の部分だったりと。 一体2003と2005はどれ位の違いがあるのでしょうか。 もしご存じの方がいらっしゃいましたら教えていただけないでしょうか。お願い致します。

  • VC++6.0からVC++.NETへの変遷について

    VC++がようやく分かり出したこの頃ですが、今日本屋に立ち寄ったら、なっ なんとVC++の本がほとんど無くなり、代わりにVC++.NETとVC#ばかりになっていました。 C#はVC++とは違うと聞いていたのですが、読んでみるとVC++.NETもかなり違ってました。 (かなり違うという表現は、各人の状況により意見が異なると思いますが) 私のような本を見ながらコードを打って勉強している初心者にとって、VC++.NETの本ではVC++6.0を動かすことができません。 今から勉強する人や本を買って勉強しようとしている人あるいは、コンパイラを手に入れようとしている人はVC++.NETに移行してしまわざるを得ないのでしょうか? すでにVC++6.0を十分活用出来ている人も、時代の流れでNETやC#を勉強していかなければならないのでしょうか? つまり、単なるバージョンアップとは一線をなす変更がなされたということなのでしょうか? 良くご存知の方見解をお願いします。

  • VC#とVC#.NETの違い

    VC#の勉強をしたいと思い、VC#の本を2冊、VC#.netの本を2冊、それぞれネットで購入しました。 このふたつは違うものなのでしょうか? 教えてください。 http://oshiete1.goo.ne.jp/qa723909.html ここをみるとほぼ同じようですが、VC#でWEBアプリは作れるのでしょうか。 自分の勉強がてら、会社の人のスケジュール帳をエクセルで、WEB上から更新できるようにするのが目的です。

  • VC++.NET って・・・・

    教えてほしいのですが、 VC++.NET Standerd で制作したプログラムって .NET FrameWorksなしで動作するのでしょうか? また、 VC++ 6.0 ・ 5.0 で動作するプログラムを変更なしに そのまま VC++.NET で利用することはできますか? VB.NETで制作したプログラムは .NET FrameWorksがないと動作しなくって VC++6.0で制作したプログラムって ランタイムなしで動作しますよね!? そのあたりのことが分かりません。 どなたかご存知の方 ご解答をお願いいたします m(_ _)m

  • VC++とVC#何が違うのでしょうか?

    先日、OKWAVEで勉強するならどんなプログラミングが良いかと質問し、C言語を勉強しようと決めました。オススメはVC++との事です。で、少し調べようと思い、調べていくとVC++とVC#というものがあるらしいのですが、何が違うのでしょうか? 勉強するならやはりオススメしていただいたVC++でしょうか? 詳しい方、いらっしゃいましたら教えてください。宜しくお願いします。

  • C#とVC++.NETについて教えて下さい。

    質問タイトルが漠然としててごめんなさい。 特別なソフトを作る訳ではないのですが、暇プロレベルで最近やっと 苦労の末、.NET以前のVC++を理解できて、VC++ってMFC を使う為の言語のだなーと思っている感じです。 C#は購入済みですが、まだ触ってません。VC++.NETは未購入 の状態です。 そこで質問なのですが、  (1)WIN32アプリにはC#とVC++.NETどちらが適していますか?  (2)VC++.NETはやはりMFC寄りの言語なのでしょうか? インラインアセンブルとかもやりたいのですが、  (3)VC++.NETではできますか?C#では? C#は見た目がC言語でクラスも使えるのでVC++.NETとどう違う のか良くわかりません。自分的にはC言語でなんでもやって行って、 C++はクラスが分かる程度で良しとしようと思っています。 詳しい方、漠然とした質問で申し訳ございませんが、ご教授お願いします。

  • C++のシングルトンオブジェクトに対するポインタについて

    C++のシングルトンオブジェクトに対するポインタについて 只今C++を勉強中(すいませんが初心者)です。 タイトルの通り、C++のシングルトンオブジェクトに対するポインタについて 調べているのですが、web、手持ちの書籍上(もちろん入門系です)では確認 できなかったので、ここで質問をさせていただいております。 シングルトンオブジェクトのアドレスを保持しているポインタを、マルチスレッド 環境で利用する場合ってどの様な動きになるのでしょうか? 例えば同時アクセスされた瞬間、オブジェクト(ポインタ)は共有されるのか、 それともキューが発生してしまうのか、が知りたいです。

  • VCの使い方

    tororinnと申します。 現在、C言語の勉強をしております。 以前まではボーランド社の無償コンパイラを利用していたのですが、最近、VCを利用しております。 さて、質問ですが、 簡単に申しますとVCの使い方がわかりません。 以前、学校でVCを使っていたのですが、やり方をすっかり忘れてしまいました。 要は、ボーランドでやっていた時のように、 シンプルにコンパイラ(ビルド)をおこなった際に、 プロンプトに実行結果が出力されるのが、ベストです。 いろいろサイトを見て回って、 [新規作成]-「プロジェクト」-「win32 Application」 を選択して、 簡単な"hello"などを出力するだけのプログラムを試しに作ったのですが、 ビルドではエラーがないのに対し、 実行すると、「プログラムを実行できません」というメッセージが出てきます。 なにとぞ、よろしくお願い申し上げます。

  • VC++(MFC) とVC++,NETの違いと今度の需要

    VC++(MFC) とVC++.NET の違いと今後の需要についてです。 IT関係のものではないですが、パソコンが好きで 独学でプログラムの勉強をしようと考えています。 C言語は大学のカリキュラムで習った程度で、 Javaの文法的な独学の経験は多少あるという程度の者です。 まず、質問なんですが 「Visual Studio .NET 2005」を使用してできるのは、VC++(MFC)ではなく、VC++.NETの方ですよね? 「Visual Studio2008 Express Edition」もVC++.NETですかね? 従来のVC++(MFC)をやるにはどうすれば?まだ売っているんですか? (企業の求人にVC++(MFC)と限定して書いてあったので) また、無償のExpress Editionだとこれ以上の機能のフリーソフトは 作れないよ~みたいな制限なんかあれば教えてください。 メインの質問に戻りますが、 同じVC++でも MFCと.NET Freamework(,NET言語)じゃ ネイティブコードを吐き出さない(.NET)とは、処理速度が 違うんじゃないのかなぁーと思いまして。(よく理解してませんがw) それで、今後自分で勉強していくにあたって、どちらをすべきで 需要があるかなど迷っているんです。 それと合わせて、SQLデータベースを勉強するに当たってですが、 個人で勉強するには、何がいいかなと思いまして。 なんかオラクルなんて個人レベルじゃとっつきにくいんです。 MS-AccessかMySQL(Linux)でやってみようかと思うんですが スキルアップ(実用的ですかね)になりますかね? 現在Cent OS 4でMySQLが動くようにはしています。 また、何を作るかによって違ってくるとは思いますが、 何言語でwindowsアプリケーションを作り、そのアプリケーションから データベースに接続し、データを取得、表示、更新するようなものが一般的と思いますが、言語とデータベースの開発環境の組み合わせの 選択が、企業などの開発業務に携わったことがないので、 わかんないんです。 言語はこれで、データベースはこれ、で「******が出来るアプリケーション」を作ってみては?みたいな進めやすい例はないものでしょうか? いろいろ調べてるんですが、初心者向けに文法的なことは書いていますが、アプリケーションを実際に作りながら進めていく、VC++.NET(クライアント側windowsアプリケーション(画面))とAccess(サーバ側)を使用した、「個人用データ管理システム」みたいなのが見あたらないんです。 言語文法ばかり勉強しても、個人(自宅レベル)では 具体的な作品を作らないと実感が沸いてこないので。。。 いろんな情報教えていただけませんか? 調べる努力はしていますが、前に進まず、悔しいです(>.<) お願いします!

  • VC++について

    お世話になります。 最近VC++の勉強を始めた物です。 お聞きしたいのですが、VC++2010はVBの機能のように”.”(ピリオド)を打つことでオブジェクトのプロパティを呼び出すことは出来ないんでしょうか? 出来ないのであればVC++使用者の皆様は、すべて本かネットで調べ上げているのでしょうか? 基礎的なことで申し訳ありませんが、ぜひ教えてください。 よろしくお願いします。