C ++の基本を学び、ポインターをいつ使用するかについて頭を悩ませようとしています。Javascript-Actionscriptのバックグラウンドから来ている私はこれに似たものは考えられません。
誰かがJavascriptまたはActionscript3のポインターに相当するものを提案できますか?また、それらをいつ使用する可能性がありますか?
C ++の基本を学び、ポインターをいつ使用するかについて頭を悩ませようとしています。Javascript-Actionscriptのバックグラウンドから来ている私はこれに似たものは考えられません。
誰かがJavascriptまたはActionscript3のポインターに相当するものを提案できますか?また、それらをいつ使用する可能性がありますか?
簡単な答えは、javascript や actionscript にはポインターに似たものは何もないということです。
すべての言語は、ポインターによって提供される機能を実装しますが、最近のほとんどの言語では、それらがプログラマーから隠されています。C/C++ は、それらを公開して使用することを要求することにより、多くの機能を提供します。他のほとんどの言語は、プログラマーがそれらを隠して自分自身を傷つけないようにしています。自分のメモリ管理に責任を持つことは、危険な場合があります。また、C と C++ は JavaScript、ActionScript、さらには Java や C# よりも古い言語であることを思い出してください。これらの「原始的な」時代にはポインター構文が必要でした。(C は、そのメモリ管理においてアセンブリ コードに非常に近く、C++ は C から直接派生しています。)
しかし、すべてのプログラミング言語は依然としてメモリを管理する必要があります。つまり、(新しい) 変数を作成し、それらの変数にアクセスし、それらへの参照を保存できるようにする必要があります。関数についても同様です。
あなたがしていることのいくつかを見て、ポインターの考え方でそれらを考えてください。
C/C++ で多くのプログラミングを開始すると、ほとんどすべての操作でポインター (および関連する概念である参照) を使用することに気付くでしょう。慣れると、ずっと同じような概念を使用してきたことに気付くでしょう。自分が何をしているのかを明確に意識する必要はありませんでした。すべてのプログラミング言語がそのメモリと何をしなければならないかについて、暗黙的であろうと明示的であろうと、より多くのことに気付くでしょう。
ポインター (または参照) を考慮することにより、実際のオブジェクトのアドレスを保持する値。
AS3 では、「オブジェクト」のサブクラスへの参照はすべてポインターです。
var a:Point = new Point(0, 0);
var pointer:Point;
pointer = a;
オブジェクト「ポインター」への変更は実際には「a」を変更するため、「ポインター」は、引数として関数に渡された場合でも、「a」へのポインター/参照 (アドレスを保持) です。パラメーターはポインターです (参照によって渡されます)。値ではありません)。
ただし、'Point' のように 'Object' のサブクラスではないプリミティブ型は、常に値によって新しい変数またはパラメーターに渡されます (コピーされます)。プリミティブ型には、int、uint、Boolean、Number、String が含まれます。
ところで、C++ ポインターは特別な種類の「参照」実装です。
良い1対1のマッピングはありません。ポインタは他の言語では隠されています。これは、非常に強力ですが、アプリケーションがクラッシュする傾向があるためです。
一般に、操作しているオブジェクトの存続期間によって作成コンテキストから脱出できる場合は、ポインターを使用します。それでも、適切な場合にポインタを自動的に削除する別のオブジェクトでポインタをラップすることをお勧めします。
C ++参照に調査を加え、C ++がオブジェクトをサイレントにコピーする場合(コピーコンストラクターなど)、参照の有用性が明らかになります。次に、参照にいくつかの使用制限があることに気付いたとき、ポインタが残ります。:)
それがあなたを始めることを願っています!
javascriptやactionscript-3には同様の概念はありません。
C++ は、C 言語からポインターの概念を引き継いでいます。基本的に、C/C++ ポインタは型インスタンスを指す具体的なメモリ アドレスを保持しますが、C++ はクラス型の多態的な解決を追加しました。
C++ で型インスタンスへの参照を渡す (関数パラメーターとして) または格納する (変数、クラス属性として) 好ましいメカニズムは、(uummm) 参照または値です。これは、すべての状況で可能であるとは限りません。
C++ 参照 (&
型指定子を参照) は基本的に同じですが、有効な型インスタンスを参照する有効なメモリ アドレスに初期化する必要があります。対照的に、ポインターはNULL
値を保持することもでき、有効な型インスタンスが参照されていないことを示します。
さらに、C++ で生のポインター型 (C のようなもの) を使用することはまったくお勧めできません。標準ライブラリは、インスタンス参照の特定のセマンティック ユース ケースの状況に対してサロゲート (スマート ポインター型) のようないくつかのポインターを提供し、ライフタイム管理 aso に対処します (C++ には固有のガベージ コレクション メカニズムがないことを思い出してください)。
Google と SO には、このトピックに関するその他のリソースが多数あります。
私は概念的に、2 つの列と無限の行を持つ巨大なテーブルのようなポインターを考えるのが好きです。最初の列にはメモリへのアドレスがあり、2 番目の列にはそのアドレスに格納されている値があり、次のようになります。
char *catString = "cat"; //C picked free space at address 3 to hold this string
Address Value
0 23
1 'r'
2 12.2
3 'c'
4 'a'
5 't'
6 '/0'
... ...
catString が実際に保持する値は、「cat」ではなく 3 です。文字列「cat」はメモリ内にありますが、ポインター catString は文字列がどこにあるかを知っているだけで、そのメモリアドレスにある文字列の最初の文字を指しています。これが、文字列にヌル プラグが必要な理由でもあります。アドレス 6 に注意してください。そのため、印刷時に、プログラムはいつ文字の印刷を停止するかを認識します。 文字の配列char *str;
を読み取るよりCスタイルです。これは、より文字列に優しいC++と同等です。string str;
次の例を検討してください。
a = {a:1, b:2};
b = a;
b.a = 4;
console.log(a.a); // outputs 4
オブジェクトでは、JavaScript はポインターのように機能します。
ここに別の見方があります。
ポインターは、キッチンの特定の引き出しを調べるように指示する、手に持っている一枚の紙のようなものだと考えてください。その紙片を家に住んでいる人なら誰にでも渡すことができ、その紙片の指示に従えば、全員が同じ引き出しを開けます。
A さんが引き出しに何かを入れ、後で B さんにその紙片を渡したとしても、B さんは A さんがそこに置いたものを探しに行くことができます。
等々。