プログラミング備忘録

イラストも描けるエンジニアになりたい情報学部生です!IT関連の知識、経験に欠けているため色々と覚えていこう(+画力の向上過程を残したい)という主旨の備忘録ブログ!

C言語ポインタ備忘録②

遅々たる進展ですが少しずつポインタの勉強をしています。

今回はswap関数と値渡しなるものについて取り上げていきます。

ポインタのお話の中で当然のように出てくるswap関数なんですが本の説明が分かりにくいのか理解力が及ばないのかさっぱり(;^_^A

 

このswap関数とは変数の値をその名のとおり交換するものでして、「ポインタを使わないと変数の値が交換されないよ!」ということを説明するためによく用いられています。

まず、ポインタを使わないで変数の値を交換する例ですが・・・

f:id:martheid9881:20170315022828p:plain

f:id:martheid9881:20170315023513p:plain

このように実行して見たところ値が変わっていません。これは値渡しをしているからうまくいかないようです。

 

・・・値渡し?なんぞそれ?正直なんで上の関数が上手くいかないのかもわからない!

→というわけでググッてきました

 

値渡しとは:上のものを例に挙げると、

1.x,y,a,bにそれぞれアドレスが割り振られたとする。

2.x=5,y=10が代入される。

3.値渡しにより、x,yの値のコピーがa,bに代入される。

というように値渡しでは変数の値のコピーが渡されると考えてよいでしょう。(厳密には違うかもしれませんが)

f:id:martheid9881:20170315030850p:plain

値渡しによって渡されるのはコピーされた値なのでswap関数で交換してもa=10,b=5になるだけでx=10,y=5にはならないということです。

では、ポインタを用いるとどうなるかというと次のようになります。

f:id:martheid9881:20170315031645p:plain

この関数ではswap関数に&x,&yを引数として与えています。また、関数内では*a,*bとすることで与えられたアドレスに格納された値を参照しているためx,yの値を交換出来ているんですね。

正直この説明だと理解するのに時間がかかったり混乱する気がするので図から直感的に理解したほうが早いかもしれません。というわけで、図です。

f:id:martheid9881:20170315033220p:plain

この図において注目したいのは*a=5の5がコピーされたものではなくx=5の5であるということです。なのでswap関数によって*a=10になったということはn番地にある値が10になったということ。つまりx=10になる!

 

とまあswap関数と値渡しに関してはこのくらいで勘弁してほしいところです。

おそらくまったく難しい箇所ではないと思うんですけど、ガッツリ引っかかってしまうんだね ( ;∀;)

あ、それと上の図から私の絵のレベルは察してください!