ポインタ 説明
ざっくりと基本を。
================◆使用用途======================
関数内での変数の書き換え。
int main(){
int b;
change(○○○); //この中でbの値を書き換えたい
return 0;
}
================================================
================◆覚えること====================
*…「ポインタ宣言をあらわす記号」
ポインタを宣言する際に使用します。
&…「アドレス演算子」
変数からアドレスを抽出します。
*…「間接演算子」
アドレスから変数を参照します。
================================================
=======================!!ココ最重要!!==========================
『なんと「ポインタ宣言をあらわす記号」である*と「間接演算子」である*が
同じ文字ではありませんか!(そう、これがポインタが分かりづらくなって
いる原因・・・)』
===============================================================
--------sample---------
1: int main(){
2: int *a;
3: int b;
4:
5: b = 1;
6: a = &b;
7:
8: printf("%d", *a);
9: }
-----------------------
↑こんなプログラムがあるとしましょう。
--ex1---
1: int *a;
--------
ex1のaの前にある*は「ポインタ宣言をあらわす記号」ですか?
それとも「間接演算子」ですか?
正解は「ポインタ宣言をあらわす記号」です。
これでポインタを宣言しています。
--ex2---
6: a = &b;
--------
ex2のbの前にある&は「アドレス演算子」ですね。
これでアドレスを抽出しています。
--ex3---
8: printf("%d", *a);
--------
ex3のprintf関数の引数内でaの前についている*は
「ポインタ宣言をあらわす記号」ですか?
それとも「間接演算子」ですか?
正解は「間接演算子」です。これでアドレスをたどって
bを参照しています。
--------sample---------
1: int main(){
2: int b;
3:
4: change(&b);
5:
6: return 0;
7: }
8:
9: void change(int *a){
10: *a = 1
11: }
-----------------------
↑では次に一番初めにでてきたプログラムを考えましょう。
---ex4---
4: change(&b);
---------
ex4でのbの前の&は上の方で学んだとおり「アドレス演算子」です。
アドレスを抽出しています。
さて、抽出したアドレスはどこにいくのでしょう。
---ex5---
9: void change(int *a){
---------
ex5の*aに注目です。このaの前にある*は
「ポインタ宣言をあらわす記号」ですか?
それとも「間接演算子」ですか?
正解は「ポインタ宣言をあらわす記号」です。
関数の仮引数は関数の実引数に代入されますから、
関数を呼び出す際に、
「int *a = &b」が実行されていると考えることができますね。
ということで、bから抽出したアドレスで、aが初期化されています。
この後、以下の文が実行されます。
---ex6---
10: *a = 1
---------
また*が使われています。これは
「ポインタ宣言をあらわす記号」ですか?
それとも「間接演算子」ですか?
正解は「間接演算子」です。
aに入っているアドレスをたどって、元の変数bを参照しています。
したがってbを1に書き換えることが出来ました。
どうでしたか?ポインタの基本は理解できましたか?
重要なのは出てきた*が常に「ポインタ宣言をあらわす記号」なのか、
「間接演算子」なのかを意識することです。
これを意識するだけで今まで理解できなかったポインタが理解できるように
なるのではないでしょうか?
※このあたり分かりづらいとかありましたら指摘ください。