KATUBLO
2019年06月01日

【Go初心者】ポインタにおけるアンパサンド(&) とアスタリスク(*)の違いを徹底解説!

こんにちは。KATUOです。今回は「ポインタにおけるアンパサンド(&) とアスタリスク(*)の違い」について書いていこうと思います。

 

Go言語で大っ嫌いだったC言語のポインタに遭遇

GO言語始めました

ツイートにもあるように、最近インターン先でサーバーサイドでgoを書き始めました。

 

ついに実務でポインタに遭遇

大学の授業の「アセンブラ言語」や「C言語」で一応は勉強をしていたポインタについに実務で初登場しました。

 

 

この*ですね。この記事で一緒に勉強してみましょう。

 

https://play.golang.org/

↑GOをブラウザで気軽に実行できるサイトです!よかったら使ってみてください!

 

ポインタの使い方をざっくり見てみる

アンパサンド(&)について

 

&は変数からポインタを抽出するのに用いられます。変数のポインタを取れてる証拠はこの出力をみればわかります。

 

&{1 2}

 

↑ &(アンパサンド)がついていればこれはポインタですね。

ちなみに:=は関数内のみ使用可能はvar宣言の省略記号です。

 

アスタリスク(*)について

 

アドレスを渡されたTest内でのaはポインタ型です。よって*をつけることでそのアドレスが指す変数を参照することができます。

以下のコードなんかはaのアドレスが指す箱に値を格納

*a += 1

はaの変数に対応する箱の中の値に1を足しています。

 

アドレスモードと間接参照モード

 

アドレスモードとは

 

最初の型宣言の部分で*をつけると、この変数はアドレスしか持たない変数になります。この状態はアドレスモードと呼ばれます。アドレスモードって聞いたことあったけど、このアドレスしか持たない変数のことを言うんですね。

 

 

間接参照モードとは

 

sampleに&をつけることでアドレスを指すので、pointerSampleは一旦sampleのアドレスを保持します。

次が大切! *をつけることでモードチェンジが発生し、アドレスで指定された部分の値を指定することができるようになります。つまりポインタ型で宣言した変数も値を表示できるということです。

 

ポインタを使うメリット

コピー処理の高速化

値渡しを実行するとき、毎度変数を新しく定義し、メモリ(アドレスを取得し、箱を指定)食う必要が無くなります。なので処理が高速化します。

 

 

使用した参考書

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

 

参考にさせていただいた記事

https://qiita.com/tmzkysk/items/1b73eaf415fee91aaad3

https://qiita.com/tobita0000/items/c6ceca297fd0be99df58

 

最後まで読んで頂き、ありがとうございました。
SNS等でのシェアが頂ければ幸いです!

プロフィール

@KATUO

現在都内私立大学に通う大学4年生。大学では電気電子工学を専攻。大学2年の夏頃に、プログラマーの長期インターン募集の広告が目に止まり、独学でプログラミングの学習をスタート。この時期からプログラミングにどハマりし、現在までに「AIスタートアップ」「Webマーケティング会社」でエンジニアとしての業務に没頭してきた。

スポンサードリンク

大学生必見就活イベント