- ベストアンサー
ポインタはどんな時に使うものなの?
僕は最近C++の勉強をしている高校生です。 さっそくですが質問です。最近、ポインタを覚えました。 ポインタはメモリの番地を指定できるから低レベル処理に使えると聞きましたが その他ではいったい何に使えるのか想像がつきません。 具体的にどんな処理に使うのでしょうか? お暇があればご回答ください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
機能の低いCではポインタを使わざるを得ない場面が多いのに対し、C++には様々な機能が用意されているのでそれほどポインタを使わずに済みそうですね。思いつくところを挙げてみます。 ・配列(の要素)をアクセスする時 配列のアクセスはポインタを使ったアクセスに置き換えができます。ポインタを使ったほうがコーディングがすっきりしたり、配列アクセスより処理が速かったりします(が、コンパイラには最適化機能があるので、あまり気にしないほうがよいかもw)。 例えばCの文字列はchar型の配列であり、文字列をポインタを用いて処理する場面がよくあります。charの配列に限らず、intの配列や構造体の配列もポインタでアクセスできます。 ・関数への引数 関数の引数として配列を渡す場合、実際には引数としてポインタが渡ります。呼ばれた関数はポインタを受け取っているのです。 構造体を直接引数にして関数に渡すことはできますが、構造体へのポインタを渡せば、メモリのコピーをしなくて済むので、処理が速くなります。 呼び出された関数は、ポインタ経由でデータを受け取り、処理した結果をポインタ経由で返すこともできます。C++ではこれらを参照(reference)で実現でき、ポインタを使わないほうが望ましいとされるので、ポインタを使う機会はぐっと減ります。 ・リスト構造(一方向、双方向、二分木などの自己参照構造体) ある要素から次の要素へのリンクをポインタで実現します。 ・関数へのポインタというのもあります。 コールバック関数は関数へのポインタを渡す事で簡単に実現できます。 関数へのポインタを配列に並べておき、インデックスで関数を指定し実際の処理を選択・変更することもできます。これはif~else ifやswitchでも実現できますが、インタープリタのようなことをすっきり実現できます。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
大きく分けて次の三つの使い方になります。 1. オブジェクトの参照 オブジェクトの値ではなく、どのオブジェクトであるかを指定することができます。 2. 動的なオブジェクトの保持 newやmallocなどで動的に割り付けたオブジェクトを保持できます。 3. 配列に対する反復子 配列の要素をたどることができます。
お礼
回答ありがとうございます。
一つの例。 今、100個の個人データを含んだレコード(構造体)の配列があるとする。 処理の都合上、年齢の若い順番にソートしたデータと、緯度で東の方に住んでいる人から順にソートしたデータを作りたいとする。 この時、ポインタがないと、元のデータをコピーして、キーをもとに、ソートするということになります。この時のデータの操作量(演算量)は、相等に大きな物です。 ポインタがあると、年齢の若い順に、ポインタを格納するポインタ配列と、緯度の順にポインタを格納するポインタ配列を使います。 元のデータのコピーは、不要になります。まず、ポインタ配列には、元のデータの順番で、ポインタを格納します。それから、ポインタ配列内をソートします。この場合、すべて、操作は、ソートの為の比較以外は、ポインタの付け替えだけで済みます。 ポインタがない場合は、データ全体を移動させたりしなければなりません。 つまり、ポインタの方がデータ移動が少ないので、処理が軽くて済むということです.
お礼
回答ありがとうございます。
一例ですが、関数の引数に使用します。 関数の引数にポインタを使うことで出力引数にできたり 巨大なデータをポインタだけで受け渡しできたりします。 また、C言語では文字列をポインタを使って char * で表現します。 まず、この辺から使い慣れていくのが良いと思います。
お礼
回答ありがとうございます。
- e00083
- ベストアンサー率31% (25/80)
素人なのでまちがってたらごめんなさい。 パソコンの記憶できる量は、限られています。 大きなデータならなおさらです。 そんなとき、一度記憶した番地を呼び出すことで、領域を有効に活用しているのがポインターです。
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。