• ベストアンサー

ポインタって?

プログラムで出てくるポインタって、何が便利なんですか? ポインタを使うと良くなる点を教えてください。

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

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

一言で言うと、”メモリの使用量の節約とプログラムの高速化”。 ポインタの習い始めのうちは、こう理解しておけばいいんじゃないかな。

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

その他の回答 (5)

回答No.5

実体がポインタである(たとえば、配列名を使う場合や、関数呼び出し)というケースを除けば、目に見える形のポインタは、なくてもそんなに困ることはありません。 とりあえず、困るようなケースは 1)C言語の標準関数や、Cで作られた資産を利用して、「文字列」を扱う場合 C言語の文字列は、char 型へのポインタとして定義されている(文字列というものは存在しない)ので、ポインタの概念は必要です。 これは、C++の範囲で、std::string を使えば、かなりのところまでポインタ無しでなんとかなります。 2)動的なデータを扱う場合 データの数があらかじめ決まっている場合は、配列が使えますが、そうでない場合、データの量に応じてデータ領域を「確保」する必要があります。 この新たに確保した領域は、ポインタ経由で扱うことになるので、この場合ポインタが必要です。 これも、C++の範囲で、STL と呼ばれる、コンテナを使えば、かなりのところまでポインタ無しでなんとかなります。 3)関数の引数を関数内部で変化させる場合 C言語では引数は、値によるコピーで渡されます。 従って、 void(int n){ n++; } のような関数では、呼び出し側では、変化した後の n を取得できません。 この場合、ポインタ経由で引数を渡すことになります。 (ポインタ自体は、コピーされるだけだが、そのポインタを経由して、データの実体を操作するため) これも、C++の、「参照型」を使えば、見かけ上ポインタ無しですますことができます。 4)関数を引数/変数として扱う場合 この場合も、「関数ポインタ」が必要になります。 いろいろな処理を切り替えて使うには便利です。 こんなところでしょうか。

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

直接アドレスを参照することによって処理を高速化ができる。

全文を見る
すると、全ての回答が全文表示されます。
  • hogejo
  • ベストアンサー率42% (11/26)
回答No.3

・他の方も仰ってましたが、配列へのアクセスにはポインタを使います。 ・例えば、文字列や構造体を編集する関数などを作る場合に必要になるでしょう。 関数に渡せる値、関数が返せる値はポインタかint/long/double/float/charだけです(何か抜けてるかも)。つまり、文字列(というかcharの配列)や構造体そのものを渡したり、受け取ったりはできません。char配列へのポインタや構造体へのポインタを関数に渡すことによって、操作したいデータを関数に伝えなければなりません。 ・ヒープ領域に確保したメモリに保存されているデータを指すのに使います。(関数内で宣言した変数のデータは関数の終了後にメモリから消えてしまいます。プログラム内で動的にサイズが変わるデータを扱う場合は、ヒープ領域にデータを保存しますが、そのデータにアクセスするためにポインタを使います。) 他の言語、例えばjavaにもポインタはあります。 ただ、C言語はポインタ演算が出来たり、ポインタを色んな型のポインタにキャストできてしまうので、ちょっととっつきにくい所があるかもしれません。(この辺が便利な所だと思いますが)

参考URL:
http://www.st.rim.or.jp/~phinloda/cqa/cqa2.html
全文を見る
すると、全ての回答が全文表示されます。
  • mtfoggy
  • ベストアンサー率14% (37/255)
回答No.2

>何が便利なんですか? 配列を使った事ないのですか?

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

C/C++では、ポインタなしでは有益なプログラムはまず書けません。 というわけで、 > ポインタを使うと良くなる点を教えてください。 に対する回答は、「有益なプログラムが書けるようになる」です。 ポインタなしで書けるプログラムは、(サンプルとして示すような)簡単なコード片ぐらいです。 ちなみに、C/C++では、ポインタがなければ関数を呼び出すことすらできません。なぜなら、関数呼び出し演算子である()は、オペランドとして関数へのポインタを要求するからです。

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

関連するQ&A

  • ポインタについて

    ポインタ配列を用いて最高点と平均点を求めるプログラムを作りたいと考えています。 配列の中身…45,78,56,35,47,98,-999 ※-999はデータの終わり ポインタ配列を使わないのならばすぐに解けるのですが… 考え方やソースなど教えてくれれば助かります。 よろしくお願いします。

  • マウスポインタを隠したい

    いつもお世話になっております。 VC++のプログラムで、 キーボードのみを使った専用アプリケーションを作っております。 そのためマウスのポインタが起動時に中央に来てしまい、 これを消したいです。 マウスの機能自体は生きていてもぜんぜん構わないのですが、 ポインタを透明にするか、点にして目立たなくさせる、等の 機能をご存知でしょうか?

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

    ポインタ変数の宣言 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言語のポインタとスタックポインタ

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

  • ポインタのポインタの利用方法

    ポインタはデータのアドレスと解釈しているのですが、ポインタのポインタはどう理解したらよいのでしょうか? よく利用する場面や、使用にあたって注意する点などプロの方お願いします。

  • ポインタが動かない

    マウスのポインターが不規則な動きをします。 タッチパネルを使ったり、マウスやマウスパットを色々と組み替えたり、感度設定をしてみても全く変化はありません。インターネットエクスプローラー7をダウンロードしてからは特に症状がひどく、ゲームサイトやMLBのページなど画面上で動画が再生されている様なページに行くと、ポインターがある点にとどまると、そこからどこに動かそうとしても、少し移動しただけで、ある点に戻って来てしまいます。マウスを単純に上に動かすとある点から~2cm位の位置をポインタが行ったりきたりするだけで、強制終了でしか画面を終了できない始末です。 これはどういった原因が考えられるのでしょうか?

  • 変数、ポインタ

    (1)「変数」と「ポインタ」についてそれぞれ違いがわかるように説明せよ。 (2)プログラムにおいて使用される「再帰的呼び出し」と「ループ」について それぞれ違いが分かるように説明せよ (3)数値計算プログラムなどで利用する「固定小数点表示」と「浮動小数点表示」 についてそれぞれ違いが分かるように説明せよ (4)コンピュータの構成要素のうち「主記憶装置」と「補助記憶装置」について それぞれ違いが分かるように説明せよ うまくどう説明していいか分かりません。 誰か教えて下さい。お願いします。

  • ポインタを使うことのメリットとは??

     こんばんは、Cの初心者です宜しくお願いします。  Cでポインタの記述を良く見るのですが、色々と本とかサイトとかで調べましたが、ポインタを使うことのメリットとか、使う理由を書いてるものに巡り合いません。  一体何故ポインタというものがあるのでしょうか。  変数(アドレス)を参照する事で、メモリの節約とか動作が速くなるとか、そのようなものが主な理由でしょうか。  逆にポインタを使わないと書けないプログラムとかはあるのでしょうか。  関数は、ポインタを引き数として元から設計されているので仕方がないとしても、、、、、、  以上初心者としての非常に素朴な疑問です、宜しくお願いします。

  • レーザーポインター

    カテゴリに疑問がありますが・・・・・ レーザーポインターについて情報下さい。 私は生産技術の仕事に携わっています、位置決めをしたり照準場所を探したり何かと便利かな・・と思いレーザーポインターを探しています。 専用機材なら業者にもあるのですが ”あれば便利かな”という位のレベルなので予算を落としてまで・・と言う気にもなりません。 また手のひら大の大きな物はあるのですが出来ればコンパクトなものが望ましいのです。 以前ならどこにでもあったキーフォルダータイプの様な簡易型で良いのですが。 生産販売中止になった事は聞いていますがなにか情報があれば宜しくお願いします。

  • ファイルポインタ

    C言語でテキストからファイルを検索するプログラムを作っているのですが ファイルポインタ FILE *fpはgetcなどを使うと自動で入力されますが手動で普通のポインタみたいに fp++などはできないのでしょうか