ポインタのメモリ

ポインタについて聞かれました

目次

  1. ポインタって知ってますか?
  2. そもそも渡しってなんだよ
  3. Javaの場合
  4. ポインタの場合は?
  5. で、何が言いたいのか?
  6. さいごに

ポインタって知ってますか?

このサイトではJava系列のことしか話をしていないので、急に「ポインタ」といわれてもピンとくる人はいないでしょう。
通常、Javaでは変数を扱うときには「値渡し」というものを使っています。
Javaでは変数が格納されている値そのものをほかの変数に渡す処理をしています。
基本C言語においても変数の扱いは「値渡し」なのですが、ちょっと特殊な変数の渡し方を「ポインタ」といいます。
または、参照の値渡しとも言います。

そもそも渡しってなんだよ

普段は意識していないJavaにおける値渡しというのは、いかのコードにおいて、変数を代入するときの動作になります。

この時の動作で渡しの種類が3種類に大別されます。
1つめが「値渡し」、
2つめが「参照渡し」、
3つめが「ポインタ渡し
ということになります。

Javaの場合

Javaの場合はとても単純で、aに格納された値を参照してbに代入しています。
直観的でわかりやすいと思います。
基本的にC言語も同じです。

ポインタの場合は?

ポインタの場合はちょっと面倒臭くってbはaのアドレスを参照します。
例えば、aのアドレスが0x0000だったとします。
そうするとbはaのアドレスを参照してbのアドレスに0x0000を格納します。
ですので

とプログラムした場合、値渡しであれば、最初のprintでも2回目のprintでも10を出力します。
しかし、ポインタを利用してポインタ渡しにすると2回目の出力で20を結果として出します。
※実際はポインタ用の宣言があるので少々コードは変わってきます。

で、何が言いたいのか?

実はポインタを使うとパソコンのメモリの節約ができます。
なのでC言語では積極的にポインタを使うことが多いです。
で、ここからが本題なのですが、先日生徒にこのようなことを言われました。
「ポインタを使うとどれくらいのメモリが節約できて、結果実行速度はどのくらい上がるのか?」です。
残念ながら、このことについては全く意識したことはありません。
こういう時は「いい質問ですね」といって生徒をほめるのが生徒のやる気を出すうえではいいそうです。
実際どの程度早くなるかは、マシンスペックやプログラムの組み方によって変わってくるので一概には言えません。
メモリの節約についてもそうです。
組み込み機器等であれば搭載メモリが少ないのでメモリの節約の効果は大きいと思いますが、最新のパソコンでは民生機でも32GBのメモリを積んでいることも少なくありません。
この場合、比較すると大したメモリ節約の効果はないかもしれません。
Javaではメモリは大量にあるものとして、あまりメモリの管理については触れません。
というかメモリの管理は全くできないといっていいでしょう。
質問されたときにこのような回答ができなかったことを、少々悔やみました。

さいごに

今回の生徒の何気ない質問にもうろたえてしまう私です。
この記事のようにまでとはいかなくても、イレギュラーな質問にもある程度の回答ができるようになりたいと思いました。

Follow me!