Cには、変数や構造体のアドレスを保持する変数である「ポインタ」が用意されている。
一方、Javaではオブジェクトを指す「参照」によってオブジェクトを扱う。
C++はポインタと参照どっちも使える。
ポインタも参照もその目的は同じで、変数やオブジェクトの実体があるメモリ上の場所を記憶することで対象に間接的にアクセスするためにある。これがないとだいぶいろんなことができなくなる、プログラミングに必須のもの。
ポインタと参照の違いを一言で言うと、「参照はポインタの機能制限版」だということ。
例えば、Cでポインタを宣言して変数のアドレスを代入した後にそのアドレス自体に演算を行うことが出来て、配列なんかを扱うときには添字指定より直接ポインタの値を書き換えることでアクセスするほうが高速に動作する。
一方、JavaやC++の参照だと、参照自体の値に演算を施すことができない。参照が指す先の実体を生成したり差し替えることでのみ値が上書きされる。
これだけ書くとポインタのほうが便利であるように思うけど、使ってみるとポインタはいろんなことが出来るがゆえに人間にとってすごく使いにくくて間違えやすい。ポインタをインクリメントして新しい変数を指したつもりでいてもその場所には何もなかったり、ポインタ演算の結果ほかのプログラムが使ってる領域に飛んでしまってそこの値を書き換えちゃったり、バグの温床になってる。
つまり、直接演算出来なくしたり、そのほかにもポインタを機能を制限することでポインタを改良したものが参照。
自由度が高い物の機能を制限することで機能性を向上させるという、なんとも奇妙な話。
よく見ると身の回りにもいっぱいある。
一方、Javaではオブジェクトを指す「参照」によってオブジェクトを扱う。
C++はポインタと参照どっちも使える。
ポインタも参照もその目的は同じで、変数やオブジェクトの実体があるメモリ上の場所を記憶することで対象に間接的にアクセスするためにある。これがないとだいぶいろんなことができなくなる、プログラミングに必須のもの。
ポインタと参照の違いを一言で言うと、「参照はポインタの機能制限版」だということ。
例えば、Cでポインタを宣言して変数のアドレスを代入した後にそのアドレス自体に演算を行うことが出来て、配列なんかを扱うときには添字指定より直接ポインタの値を書き換えることでアクセスするほうが高速に動作する。
一方、JavaやC++の参照だと、参照自体の値に演算を施すことができない。参照が指す先の実体を生成したり差し替えることでのみ値が上書きされる。
これだけ書くとポインタのほうが便利であるように思うけど、使ってみるとポインタはいろんなことが出来るがゆえに人間にとってすごく使いにくくて間違えやすい。ポインタをインクリメントして新しい変数を指したつもりでいてもその場所には何もなかったり、ポインタ演算の結果ほかのプログラムが使ってる領域に飛んでしまってそこの値を書き換えちゃったり、バグの温床になってる。
つまり、直接演算出来なくしたり、そのほかにもポインタを機能を制限することでポインタを改良したものが参照。
自由度が高い物の機能を制限することで機能性を向上させるという、なんとも奇妙な話。
よく見ると身の回りにもいっぱいある。