ポインタで挫折した経験
はじめまして、情報系の大学に通う大学3年生です。
大学に入り、初めてプログラミングを始めた私ですが、大学の授業で触れるプログラミング言語はC言語でした。C言語の一番の壁、それはポインタだと思います。
かくいう私もポインタでC言語を挫折した人間です。それからC言語からは逃げてしまし、Python,PHP,Django,JavaScriptと様々な言語やフレームワークを勉強してきて、最近Goを始めた次第です。
ここでGoの文法の勉強を進めていく中でポインタに遭遇しました。忌々しい記憶と戦いながら、サンプルコードを眺めていると「あれ?めっちゃ簡単じゃね?」と思いました。(笑)
今まで学習してきたことが少しだけでも身についているのかな?と感じてうれしくなったので記事に残すことにしました。
ポインタが以前よりも分かるようになっただけで完全には理解できておりません。
なにか間違った記述等ありましたら、教えていただけると幸いです。
そもそもポインタって?
ポインタとは 「別の変数のアドレスを格納している変数」 のことです。
また、アドレスとは 「アドレス空間における記憶場所」 を示す通し番号のことです。
この説明のせいで私は挫折したのです。(笑)
難しいことばで説明されている(少なくとも当時はそう感じた)ため、理解困難でした。
それでは、僕がどのようにポインタを理解したのか以下にコード例と自分なりのコメントを残していますので、ぜひポインタがわからない方は参考にしてください。
コード例
package main
import "fmt"
func main() {
i, j := 42, 2701
p := &i // iのポインタ(住所)をpに代入
fmt.Println(*p) // pに格納されているポインタを通してiを出力
fmt.Println(p) // pに格納されているポインタ自体(iの住所)を出力
*p = 21 // pのポインタを通してiに21を代入
fmt.Println(i) // iを出力(pを通してiが変更された)
p = &j // jのポインタ(住所)をpに代入
*p = *p / 37 // pのポインタを通してjの値を変更
fmt.Println(j) // jを出力
}
//出力結果
42
0xc00010a000
21
73
ポインタが指しているアドレスを 「住所」 と考えると自分は理解がしやすかったです。
なんとなくの理解で「&を付けるとその変数の住所を表せるんだな。」「*を付けると、その住所に入ってる変数が表せるんだな」程度の認識で最初は全く構わないかと思います。
(分からなくてもとにかく進む!まずコードを書いてみる!ことがプログラミングにおいてはとても大事だと思っています。)
ポインタの利点
ポインタが少し理解できたのはいいが、何のために使うのか?
ずばり、 メモリにアクセスできるようになること です。
ポインタによって変数に対する新しい参照方法を可能としているのです。これによって
- 関数をまたいで変数を利用できるようになる(ローカル変数にアクセス可能)
- メモリの節約ができる
などがあげられます。
最後に
ポインタは初学者にとって非常に高い壁かと思われますが、遠回りをしてもいいので様々な言語を勉強してみたり、資格を勉強してみたりすることで以前理解できなかったことが意外と理解できたりするものです。
自分自身今回ポインタが少し理解できたことで、学習において無駄なことなんて一つもないなと感じましたし、より一層さまざまな領域の技術を吸収していこうと感じました。
今後はポインタを利用したプログラムを自分自身で最大限活用できるところまで理解できるように勉強に励もうと思う!