• ベストアンサー

ポインタはどんな時に使うものなの?

僕は最近C++の勉強をしている高校生です。 さっそくですが質問です。最近、ポインタを覚えました。 ポインタはメモリの番地を指定できるから低レベル処理に使えると聞きましたが その他ではいったい何に使えるのか想像がつきません。 具体的にどんな処理に使うのでしょうか? お暇があればご回答ください。

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

  • ベストアンサー
  • 6yemon
  • ベストアンサー率69% (25/36)
回答No.5

機能の低いCではポインタを使わざるを得ない場面が多いのに対し、C++には様々な機能が用意されているのでそれほどポインタを使わずに済みそうですね。思いつくところを挙げてみます。 ・配列(の要素)をアクセスする時 配列のアクセスはポインタを使ったアクセスに置き換えができます。ポインタを使ったほうがコーディングがすっきりしたり、配列アクセスより処理が速かったりします(が、コンパイラには最適化機能があるので、あまり気にしないほうがよいかもw)。 例えばCの文字列はchar型の配列であり、文字列をポインタを用いて処理する場面がよくあります。charの配列に限らず、intの配列や構造体の配列もポインタでアクセスできます。 ・関数への引数 関数の引数として配列を渡す場合、実際には引数としてポインタが渡ります。呼ばれた関数はポインタを受け取っているのです。 構造体を直接引数にして関数に渡すことはできますが、構造体へのポインタを渡せば、メモリのコピーをしなくて済むので、処理が速くなります。 呼び出された関数は、ポインタ経由でデータを受け取り、処理した結果をポインタ経由で返すこともできます。C++ではこれらを参照(reference)で実現でき、ポインタを使わないほうが望ましいとされるので、ポインタを使う機会はぐっと減ります。 ・リスト構造(一方向、双方向、二分木などの自己参照構造体) ある要素から次の要素へのリンクをポインタで実現します。 ・関数へのポインタというのもあります。 コールバック関数は関数へのポインタを渡す事で簡単に実現できます。 関数へのポインタを配列に並べておき、インデックスで関数を指定し実際の処理を選択・変更することもできます。これはif~else ifやswitchでも実現できますが、インタープリタのようなことをすっきり実現できます。

wccf202
質問者

お礼

回答ありがとうございます。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

大きく分けて次の三つの使い方になります。 1. オブジェクトの参照  オブジェクトの値ではなく、どのオブジェクトであるかを指定することができます。 2. 動的なオブジェクトの保持  newやmallocなどで動的に割り付けたオブジェクトを保持できます。 3. 配列に対する反復子  配列の要素をたどることができます。

wccf202
質問者

お礼

回答ありがとうございます。

noname#29459
noname#29459
回答No.3

一つの例。 今、100個の個人データを含んだレコード(構造体)の配列があるとする。  処理の都合上、年齢の若い順番にソートしたデータと、緯度で東の方に住んでいる人から順にソートしたデータを作りたいとする。  この時、ポインタがないと、元のデータをコピーして、キーをもとに、ソートするということになります。この時のデータの操作量(演算量)は、相等に大きな物です。  ポインタがあると、年齢の若い順に、ポインタを格納するポインタ配列と、緯度の順にポインタを格納するポインタ配列を使います。  元のデータのコピーは、不要になります。まず、ポインタ配列には、元のデータの順番で、ポインタを格納します。それから、ポインタ配列内をソートします。この場合、すべて、操作は、ソートの為の比較以外は、ポインタの付け替えだけで済みます。  ポインタがない場合は、データ全体を移動させたりしなければなりません。   つまり、ポインタの方がデータ移動が少ないので、処理が軽くて済むということです.

wccf202
質問者

お礼

回答ありがとうございます。

noname#110161
noname#110161
回答No.2

一例ですが、関数の引数に使用します。 関数の引数にポインタを使うことで出力引数にできたり 巨大なデータをポインタだけで受け渡しできたりします。 また、C言語では文字列をポインタを使って char * で表現します。 まず、この辺から使い慣れていくのが良いと思います。

wccf202
質問者

お礼

回答ありがとうございます。

  • e00083
  • ベストアンサー率31% (25/80)
回答No.1

素人なのでまちがってたらごめんなさい。 パソコンの記憶できる量は、限られています。 大きなデータならなおさらです。 そんなとき、一度記憶した番地を呼び出すことで、領域を有効に活用しているのがポインターです。

wccf202
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • C言語のポインタを理解するには

    今、自分はC言語のポインタを勉強しているのですがメモリの動きなどが想像できません・・・(なんでポインタを使うと速くなるのかなど) 聞いたり調べたところアセンブラをやると理解できるとのことでアセンブラをやろうと思ってるのですが他になにかやるべきことはあるでしょうか? 後コマンドプロンプトとPICは勉強になるでしょうか? 昔のパソコンを使ってるとパソコンがよくわかるみたいなことを聞いたのですが昔のパソコンなんて持ってないのでCUIのコマンドプロンプトを勉強すればなんかわかるかなと思って。 PICは自分で作れば勉強にもなるしそこからなんか得られるかなと思って聞いてみました。 まだパソコンをもって長くないのでいろいろと調べたのですがどうしてもよく理解できないところがあり質問におかしいところがあるかもしれないですがお返事よろしくお願いします。

  • 【なぜポインタを使うのか】

    私は、ポインタのメリット・デメリットを以下のように考えています。 ◆メリット メモリを多く確保しなければならないオブジェクトについて、コピー処理を行うことなく省メモリでインタフェースできる。 ◆デメリット ・関数内でしか使用しない非ポインタのローカル変数に比べ、  アクセス可能な場所が多くなってしまい、色んな箇所から値が変更されうる。(影響範囲の限定がしずらい) ・可読性が低くなる。(若いエンジニアはCの経験者は少なくっていくと思われるため、保守コストが若干割高になる) そのため、よっぽどメモリを多く使うようなオブジェクトでなければ、 (もしくは速度を重視する必要があるプログラムでなければ) 値渡しにしても良いのではと考えています。 しかし、度々目にするソースは、何でもかんでもポインタで処理しているものも多々見受けられます。 特に、int型のようなメモリを大量に使用しないものでも、ポインタで変数宣言しているケースもよく見ます。 なぜなのでしょうか? (熟練のC言語プログラマが、昔ながらの記述を踏襲しているというのはあるのかなと考えていますが)

  • ポインタみたいなもの

    Perlってポインタは利用できないんですよね。配列の要素を1つ1つ処理していってその要素の内容によって更にその配列に要素を指定した順番に追加しながら処理していくような処理を実現するにはどうしたらよいのでしょうか。C言語だったら線形リストでできるのですが。

    • ベストアンサー
    • Perl
  • ポインタについて

    C言語では char *p; と宣言しておいてそのポインタに p = "ABC"; というように指定できると思います。 参考URL http://www9.plala.or.jp/sgwr-t/c/sec10-3.html このようにしてポインタを使用した場合、freeで開放する必要はあるのでしょうか。 配列で文字列を指定した場合 char str[] = "ABC"; スタック領域に確保されるので、宣言したメソッドが終わった場合、自動的に開放されると思いますが、malloc等でヒープ領域にメモリを確保した場合、freeで開放されるまではメモリ上に残っていると思います。 動きを見てみると、 char *p; p = "ABC"; もメソッドが終わってもメモリ上に残っているように思えるのですが、 開放する必要があるのでしょうか。 上記のような指定の仕方は使わなければいいだけなのですが、 気になってしまいました。 変な質問ですいませんが、宜しくお願いします。

  • ポインタについて

    C言語のポインタの宣言の仕方についての質問です。お詳しい方どうかご回答よろしくお願いいたします。 (1)char *p; (2)char* p; 上記2つの宣言はどう違うのでしょうか??(同じものなのでしょうか??)メモリの確保の仕方などに違いがあるのでしょうか?? また、この両者はどのように使い分ければ良いかなどお教えください。 よろしくお願いいたします。

  • なぜポインタという概念が誕生したの?

    C言語には「ポインタ」という概念がありますが、そもそもなぜ「ポインタ」という概念が生まれたのですか? 「ポインタ」という概念が生まれた背景は何なんでしょうか? 当時、メモリの性能が貧弱だった為、それを有効に活用する為に生まれたのでしょうか? それに、「ポインタ」という概念がないとどうなるのでしょうか? 回答のほうよろしくお願いします。

  • ポインタ変数を変数に渡す方法

    (int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • C言語のvoid型ポインタを使いたいのですが…

    C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください

  • ポインタの宿題が解けません。

    C言語でポインタを勉強しているのですが、 char型のアドレス:0022FF47 int型のアドレス:0022FF40 が今あるとして、 このアドレスのメモリの中身はどんな状態になっていますでしょうか? visual studioのwatch で見る以外の方法で分かりましたらお願いします。

  • ポインターがかたまってしまう

    OS9.1です。iMacを使用しています。 Macについては、全く詳しくありません。 最近頻繁に、ポインタがかたまってしまいます。 ポインタがかたまるだけなので、OSや他のアプリケーション はいきています。(ショートカットは使える) こういった経験をお持ちの方、いらっしゃいましたら 解決方法を教えて下さい。 単純にメモリを増やせば解決出来るのでしょうか? Winと仮想メモリの使用の仕方が違うと聞いた事が あるのですが、どういう風に使えば適切なのかとか そういう事も分かりません。(関係があるのでしょうか?) また、原因はなんなのでしょうか? 使用頻度が高いせいかと思い、一晩使用しなくても ダメでした。フリーソフトはあまりインストールし ていません。解答ソフトとメーラーくらいのものです。 お時間がありましたら、是非教えて下さい。 宜しくお願いします。

    • ベストアンサー
    • Mac

専門家に質問してみよう