《Go言語》ポインタにおけるアンパサンド(&) とアスタリスク(*)の違いを初心者が解説

Go

&(アンパサンド)

変数からポインタを抽出するための仕組み

&(アンパサンド)は変数からポインタを抽出するために用いられる仕組みのことを指します。以下のプログラムを見てください。

&をつけることで変数xが指すアドレスを参照することができます。元々int型で定義されていた変数に対して、&をつけると*int型になります。&ではなくて*(アスタリスク)をつけた時はどのような挙動になるのか試してみます。

*を使う場合はint型ではなくポインタ型でなくてはいけません。これは後ほど説明しますが、簡単にいうとアドレスが入る専用の型でないと*は使えないのです。ちなみに一番初めのプログラムを少し変更して以下のように書いてみます。

int64型は2の8乗、64ビット分のメモリを消費するのでちょうどxとyのアドレスも8ビット分空いていることがわかります。ちなみにアドレスといっていますが、その型が確保した先頭のアドレスのことを暗黙的にアドレスといいます。

*(アスタリスク)

ポインタが指すアドレスの値を参照する

まず大前提*はポインタ型に対して使えるものです。int型などには使えません。なので先程のプログラムではエラーが出ました。
*(アスタリスク)の役割を説明します。*をポインタ型に使うとポインタが指すアドレスの値を参照することができます。以下のプログラムを見てください。

insertValueの引数はポインタ型を引数として取ります。なので関数を呼び出して、引数を与える時は&を使ってアドレスを取得して、insertValueに渡しています。insertValueではvのアドレスが渡されており、関数内で直接vの値を書き換えることができます。関数内のhとvが指しているアドレスは同じなので、そのアドレスが指し示す箱の値を更新すれば双方の変数の値が変わるのは当然です。せっかくなので失敗パターンを見ていきます。insertValueの引数がポインタ型出なかった時、以下のエラーがでます。

ポインタ型でない型をinsertValueに渡すことができないのでエラーになってます。では次にinsertValueはポインタ型で指定されているが、渡された引数がポインタ型ではなかった場合のプログラムを見てみましょう。

こちらも同様、型が異なるのでエラーがでます。このような形で、ポインタを使うと関数内でもどこでもある変数の値を書き換えることが可能になります。これは余分にスコープが狭い変数を大量生成してしまうプログラムと比べるとメモリの消費量が相当少ないことが想像つきます。

番外編:働くエンジニアにおすすめアイテム3撰

記事の内容とは別に、日々エンジニアの業務を行う上で役に立っているアイテムを紹介します。どれも実際に使って良いと思ったものだけ紹介していますのでその点はご安心ください。

目の保温マッサージ

普段の業務で一番疲れる目を癒すために目元マッサージャーを毎日使っています。保温とマッサージを自動でしてくれるので、終わった後は血行が良くなり、翌日の目の疲労が激減します。また睡眠の質もあがるのでディスプレイと睨めっこの職業の方は必須アイテムだと思ってます。(笑)

座っている時の負担を減らす

8時間働くとして、その時間の殆どが椅子に座っている状態になるのがエンジニアの宿命です。椅子の性能が低いと身体に余計な負荷を掛けることとなり、良い椅子に座っている人と、そうでない椅子に座っている人にかかる1日の負担はかなり大きいです。ですので、身体への負荷を考えて、できるだけ良い椅子に座るべきです。とは言っても会社の椅子は既に決まっているので以下のクッションを購入することをおすすめします。体を包み込むようなフォールド性があり、疲労や腰の痛みなどが激減します。

自宅での作業効率をあげる椅子

最近購入したのがゲーミングチェアです。楽天ゴールドカードを持っている私は、Amazonではなく楽天市場でこの機種と似たようなものを購入しました。価格帯はほぼ同じで、このゲーミングチェアはAmazon内での評判も良いみたいですし、おすすめです。その理由は作業し終わった後の疲労感が異なり、座り心地もホールド感があって最高ですし、見た目がかっこいいからです。予算に余裕のある方は購入してみてはいかがでしょうか?

エンジニアの基礎知識・教養

別の記事でエンジニアとして知っておくべき技術本についてまとめました。スキルの高いエンジニアは極々当たり前にしっている知識だとおもいますが、そうでない方はエンジニアとして最低限知らないとまずい知識ですのでどこかで購入し、読むことをお勧めします。

タイトルとURLをコピーしました