No.455
オレメモです。
● C言語のポインタ
私の理解ですが、ポインタとは変数の扱い方の一つで、定義した名称ではなくメモリ上のアドレスを指定して変数にアクセスする方法です。変数のアドレス得る方法と、アドレス指定で変数を読み書きする方法の二つを総称したものとなります。
OSやプログラム言語はハードウェアを直視せずに済ませるためにあるのですが、ポインタはその意図に反して原始的なアプローチでメモリに直接アクセスする方法だと言ってもよいようです。
様々な解説では変数のアドレス得る方法とアドレス指定で変数を読み書きする方法、さらにポインタの効能を混在させて説明するので分かりにくいのです。
先達の意図には反しますが、少しアプローチを変えて書いてみようと思います。
ただし、変数とは保存先を表す<アドレス>と保存されている<数値>で構成されているので、この辺りが頭にイメージ出来ないと以下は理解不能だと思います。
任意のアドレスをユーザが設定することも可能ですが、OSや言語が割り当てるアドレスを使うのが普通。いや、勝手に決めて正常に動くことはまず無いでしょう。
変数のアドレスを得る方法
変数を定義するなら、
int data;
などと書けばいい。この段階で保存先のアドレスは決定されています。というか、変数が持つ情報の実体は保存先を表すアドレスです。
この変数のアドレス値を得るなら、
&data
とすればいい。変数名の前に<&>(アンパサンドと読むらしい。アンドではないそうな)を付けて装飾すると変数のアドレスを表します。
単に変数名とすれば中身を読み書き出来、変数名の頭にアンパサンドを付ければ保存先アドレスを読み書き出来るのです。
例えば、変数の中身を表示するなら、
printf("変数の中身:%d\n", data);
アドレスを表示するなら、
printf("変数の格納先アドレス:%d\n", &data);
となります。
アドレス指定で変数を読み書きする方法
変数のアドレスを保存するための変数はポインタ変数と呼ばれる特殊なものです。
通常変数と違って
int *addr;
とか
char *str_addr;
などと定義します。変数の前に<*>(アスタリスク)を付けて装飾することでポインタ変数だと宣言します。
アドレスを格納するには<*>を付けず、
addr = &data;
とします。
アドレス指定(ポインタ)で変数を読み出すには、
num = *addr;
とします。上記に続くなら変数dataの内容が変数numに入ります。
書き込むなら、
*addr = 10;
となり、変数dataの内容も10になります。何故なら、dataも*addrも同じアドレス(実体)にアクセスするからです。
ポインタの活用方法、動的変数、静的変数なども理解しなければなりませんが、先達の情報以上のことは書けそうありません。
自分ナリの整理は付きましたし、数か月後の自分が再理解できると思うのでここまで。
#C言語
● C言語のポインタ
私の理解ですが、ポインタとは変数の扱い方の一つで、定義した名称ではなくメモリ上のアドレスを指定して変数にアクセスする方法です。変数のアドレス得る方法と、アドレス指定で変数を読み書きする方法の二つを総称したものとなります。
OSやプログラム言語はハードウェアを直視せずに済ませるためにあるのですが、ポインタはその意図に反して原始的なアプローチでメモリに直接アクセスする方法だと言ってもよいようです。
様々な解説では変数のアドレス得る方法とアドレス指定で変数を読み書きする方法、さらにポインタの効能を混在させて説明するので分かりにくいのです。
先達の意図には反しますが、少しアプローチを変えて書いてみようと思います。
ただし、変数とは保存先を表す<アドレス>と保存されている<数値>で構成されているので、この辺りが頭にイメージ出来ないと以下は理解不能だと思います。
任意のアドレスをユーザが設定することも可能ですが、OSや言語が割り当てるアドレスを使うのが普通。いや、勝手に決めて正常に動くことはまず無いでしょう。
変数のアドレスを得る方法
変数を定義するなら、
int data;
などと書けばいい。この段階で保存先のアドレスは決定されています。というか、変数が持つ情報の実体は保存先を表すアドレスです。
この変数のアドレス値を得るなら、
&data
とすればいい。変数名の前に<&>(アンパサンドと読むらしい。アンドではないそうな)を付けて装飾すると変数のアドレスを表します。
単に変数名とすれば中身を読み書き出来、変数名の頭にアンパサンドを付ければ保存先アドレスを読み書き出来るのです。
例えば、変数の中身を表示するなら、
printf("変数の中身:%d\n", data);
アドレスを表示するなら、
printf("変数の格納先アドレス:%d\n", &data);
となります。
アドレス指定で変数を読み書きする方法
変数のアドレスを保存するための変数はポインタ変数と呼ばれる特殊なものです。
通常変数と違って
int *addr;
とか
char *str_addr;
などと定義します。変数の前に<*>(アスタリスク)を付けて装飾することでポインタ変数だと宣言します。
アドレスを格納するには<*>を付けず、
addr = &data;
とします。
アドレス指定(ポインタ)で変数を読み出すには、
num = *addr;
とします。上記に続くなら変数dataの内容が変数numに入ります。
書き込むなら、
*addr = 10;
となり、変数dataの内容も10になります。何故なら、dataも*addrも同じアドレス(実体)にアクセスするからです。
ポインタの活用方法、動的変数、静的変数なども理解しなければなりませんが、先達の情報以上のことは書けそうありません。
自分ナリの整理は付きましたし、数か月後の自分が再理解できると思うのでここまで。
#C言語