ポインタの使用例と利点は何ですか?[閉まっている]


10

ポインタの利点を理解するのに苦労します(低レベルのプログラミングを除く)。

Stringやchar []の代わりにchar *を使用する理由、またはポインター演算がもたらす利点

では、ポインタの利点と使用例は何ですか?


6
これは少々エリート主義のように聞こえますが、私見では、ポインタの賛否両論について尋ねる必要がある場合、おそらくそれらは必要ありません。
Jas

3
多分!しかし、質問はまだ有効です!
Zolomon、2010年

1
多くのプログラミング言語がCの意味で実際のポインタを持っているわけではないため、これも実際には言語に依存しません。
David Thornley、2010年

回答:


6

ポインターは、動的なメモリの場所、多くのデータ構造、および大量のデータの効率的な処理に必要です。ポインターがないと、すべてのプログラムデータをグローバルに割り当てるか、関数または同等のものに割り当てる必要があり、データの量が元々許可していた量を超えた場合、頼りになりません。ここでは絶対を使用することをためらっていますが、私の知る限り、すべての現代のコンピューター言語には何らかの形でポインターがあります。

ポインタを使用するほとんどの言語では、ポインタである特定の種類の参照があり、おそらくそうでない特定の種類の参照があり、それ以上の表記上の違いはありません。Lisp consセルはポインタのペアですが、a fixnumはポインタではありません。Javaでは、クラスのインスタンスに使用される変数はポインターですが、そうでintはありません。言語構文はそれを反映していません。

Cは、ポインターがオプションで明示的であり、明示的なポインター演算を許可するという点で異常です。を書くことは完全に可能struct foo bar; struct foo * baz;であり、メモリを割り当てbazたら、barbazを表すことができますstruct foo。ポインタはオプションなので、表記上の違いがあると便利です。(与えられたようにboost::shared_ptr<foo> bar;、それbar.reset()はスマートポインターのためのC ++で不可欠です、1つの意味bar->reset()があり、大きく異なる可能性があります。)

(実際に^は、Pascal などのCが最初に開発されたとき、明示的なポインターが他の言語でよく使用されていました。Cは、現在一般的に使用されているほとんどの言語よりも古い言語であり、それが示しています。)

Cの設計目標の1つは、Unixを書き込むことでした。そのため、メモリの場所を詳細に処理する必要がありました。(Cは実際には、設計時に一般的なシステム実装言語のファミリーの1つであり、もう1つの例は制御データコンピューター用のCybolです。Cは大ヒットしたものです。)したがって、Cポインターを直接操作することができます。メモリアドレスの割り当てと新しいアドレスの計算。これはまた、Cでいくつかの設計上の決定につながりました。C配列はポインター演算に大きく基づいており、実際、配列は非常に多くの状況でポインターに減衰します。参照によるC関数への変数の受け渡しは、ポインターによって行われます。配列や、他の現代的な言語のような形式で参照によって変数を渡す必要はなかったため、Cはそれらを取得しませんでした。

ですから、答えは、今日のほとんどの言語では、事実に気付かれることなく常にポインタを使用しているということです。Cでは、C ++ではそれほどではありませんが、ポインターを使用して低レベルの処理を行うか、特別な表記法がない高レベルの処理を実行します。


とても良い答え
ケイトグレゴリー

1
この答えは、C / C ++のポインターとJavaのリファレンスの間で理解できなかった違いを最もよく表しているので、受け入れます。
OliverS 2010年

Gosling(Javaの主要な作成者)によって認識された「con」をより明確にするために、Javaがポインターを使用しない理由の簡単な説明を追加するとよいでしょう。
グイドアンセルミ2014

10

複雑なデータ構造。リンクされたリストやバイナリツリーのようなものは、ポインタなしでは構築できません。

ポインタの「長所」と「短所」はありません。それらはハンマーのような単なる道具です。


5
Javaでは、ポインタはありません。しかし、リンクリストとバイナリツリーを構築することは可能です。参照(Javaなど)とポインター(Cなど)には違いがあります。
StartClass0830

7
参照とポインタの間に違いはありません。ポインター演算はC固有です。ポインタはあるが、ポインタ演算がない(Pascalなど)他の言語もあります。
zvrba

1
ポインタと参照は、あなたが思うように同義ではありません。これを読んで違いを確認してください。stackoverflow.com/questions/57483/...
StartClass0830

4
そのリストの最初の2つの項目に対処するには:Java参照を再割り当てでき、nullを指すことができます。ポインタの際立った特徴は、別のオブジェクトを間接的に参照できることです。私のリトマステストは次のとおりです。循環データ構造(Java参照で作成できる)を構築できる場合、それはポインタです。(C ++参照では循環データ構造を構築できないことに注意してください。)
zvrba

1
ポインタと参照には違いがあります。たとえば、C#には両方があります。(blogs.msdn.com/b/ericlippert/archive/2009/02/17/...
スティーブンEversの

2
  • ポインタを使用すると、実行時にメモリを割り当てたり割り当て解除したりできます。
  • また、コピーすることなく、許可された範囲外の大きなデータ構造を使用できます。

C ++、Java、およびその他の同じタイプの言語での参照は、単なる「安全なポインタ」です。そして、これらの参照はJavaでよく使用されます。


1
C ++での参照は安全なポインタではありません。C ++での参照は、ポインタとは何の関係もありません。C ++での参照はエイリアスです。に割り当てることはできずNULL、作成後に変更することもできません。
Billy ONeal 2010年

@Billy:C ++参照は通常、ポインターを使用して実装され、いくつかの点で同様に機能するため、人々はそれらをある種の制約付きポインターと見なし続けます。
David Thornley、2010年

2

ほとんどすべてのコンピュータプログラムは、メモリ内の値を調べて変更する必要があります(十分に古い私たちにとっては、「ピークおよびポーキング」と呼ばれます)。これらの値がメモリ内のどこにあるかを制御して、結果を予測できるようにする必要があります(場合によっては、順序が重要です。実行可能コードのロードは1つの例です)。したがって、メモリ内の場所を表すデータ型が必要です。あなたのプログラミング環境が抽象化の下でそれを隠したとしても、それはまだそこにあります。


2

char*ポインタの不器用な例です。おそらく、を使用std::stringするより(または、Unicode / ansi /マルチバイトの特殊性を処理するより優れた型を使用する方が)良いでしょうchar*。ポインタのほぼすべての他の例えば(Employee*PurchaseOrder*、...)、しかし、多くの利点があります。

  • 単一の関数よりもスコープが大きい-オブジェクトをヒープに割り当て、ポインタを長時間渡す
  • 値渡しのコピーコストがないため、ラージオブジェクトの関数呼び出しが高速
  • 渡されたパラメーターを関数が変更できるようにする1つの方法
  • オブジェクト全体ではなくアドレスのみをコピーするコレクションでスペースと時間を節約する

実際、ポインタは非常に重要なので、ポインタがないように見えるほとんどの言語には、実際にはポインタしかありません。C#とJavaの参照型は、基本的には固体オブジェクトに偽装されたポインターです。

さて、ポインタ操作(p++ポインタ上、またはp += delta)はまったく別の話です。危険だと思う人もいれば、すばらしいと思う人もいます。しかし、それはあなたの質問からさらに遠いです。


1

ポインタは、データ構造とプログラム実行フットプリントを低く保つことの両方で、より高速になり、オーバーヘッドが少なくなります。(「できる」という言葉に注意してください。)

一般的には、独自の割り当てを実行するか、自分に代わって何かを実行させることによってリソースを割り当てた場合、ルールは、完了時にそれを解放することです。

上記を実行する負担は、ランタイムに実行させるのではなく、責任を開発者に戻すことです。これには、物が長持ちしたり、境界を越えたり、より適切なタイミングで廃棄されたり、ガベージコレクターの重さを運ぶ必要がないという点で、いくつかの利点があります。

エキゾチックなケースでは、通常は例外とスコープが関係しますが、クリーンアップを行うコードを回避する場合、もう少し注意する必要があるいくつかのエッジケースがあります。現実的には、これらのケースは設計することができます。私たちは何十年もの間、マネージコードなしで生活していました。

多くの場合、ポインターを「ハード」にするのは、ハードウェアレベルで何が行われているのかを理解していないだけです。それは間接的なものに過ぎません。

ポインターを使用すると、より多くの生のアクセスが可能になり、これは非常に役立つ、賢い、または必要な場合があります。どこにでもポイントして、ほとんど何でも扱うことができます。神のような力を善に使うなら、それはとても、とても良いことです。

反対側は通常、何かを解放するのを忘れたり、複数回解放したり、解放された後に何かを参照したり、どこにも指していないときに何かを参照したりすることによって無駄になります。これらのことはしばしば見事なクラッシュを引き起こします、そして正直に言うと、通常はポインターが壊れやすいというより、論理的な問題があることを示しています。

あなたが堅実な開発者であれば、ポインタを使用することは他のどのデータ構造よりも問題になりません。繰り返しになりますが、それはロケット科学ではありません。人々は何十年もの間、まばたきさえせずにそれを行いました。最近はあまり詳しく教えられていない。

そうは言っても、ポインタが必要でない限り、優れたガベージコレクションが提供する納得のいくエキゾチックなケースによって、管理された環境での作業がより快適になります。一部のメモリを取得して使用し、破棄することができるのは素晴らしいことです。そうすることが理にかなっている場合、後で破棄される可能性があることを知っています。これは、余分な処理を行うランタイムと引き換えに、コーダー側のコードが少し少なくなります。


0

最良の答えは実際に質問に含まれています:ポインターは低レベルのプログラミング用です。確かに、Cを使用している場合、ポインターを使用しないことは、片手を後ろで縛ったプログラミングのようなものですが、その答えは、代わりに高水準言語を使用することです。


-1

ポインターは、最も興味深いプログラミングに必要なマシンへの可視性を提供します。最近のほとんどの言語は、粗末な部分を単純に隠しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.