【ポインタは難しい?】
「ポインタ=番地」とわかっていても、いざ、プログラムに
とりかかるとどうやってポインタと配列を使い分けたら良いのか?
と悩むことがしばしば....。
例)ポインタと配列の宣言
┏━━━━━━━━━━━━━━━━━━┓
┃int *a; <--これはポインタ。 ┃
┃int b[100]; <--これは配列。 ┃
┗━━━━━━━━━━━━━━━━━━┛
これはおそらく、ポインタの概念と実際のC言語の文法的な表記が
頭のなかで結びつかないことが原因だと思います。
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃・*(アスタリスク)がついているから「ポインタ」 ┃
┃・[](かぎ括弧)がついているから「配列」 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
という、機械的な覚え方をしていませんか?
それでも、問題はないのですが機械的な覚え方では実際のプログラムでは
役に立たないことが多いのではないでしょうか?
【内容の理解】
例の int *a; という宣言は
「a というポインタ変数(番地を格納するための変数)」を宣言しているのです。
つまり、表記の仕方としては
(表記1) int *a;
(表記2) int* a;
(表記1)も(表記2)も同じ意味なのです。
しかし、ポインタ変数の扱いに慣れていないうちは
(表記2)のようにした方が良いでしょう。
そのほうが
「a という変数があって → その変数は int* (intへの番地)が格納される型である」
ということが明示的に理解できるからです。
→ 参考書などでは (表記1) の書き方が多いようです。
その方が都合が良い場合があるからです。
下記のような宣言をした場合に違いが出てきます。
例) int* a,b;
例は
・変数aは「ポインタ型の変数」
・変数bは「int型の変数」
として解釈されてしまいます。
変数a・b両方ともポインタ型の変数として解釈させたい場合は
int *a,*b;
と表記すれば可能です。もちろん
int* a;
int* b;
と表記すれば、同じ意味ですから。ポインタに慣れていないうちは(表記2)のように
しておいた方が無難でしょう。
【今回のまとめ】
┏━━━━━━━┓
┃1) int *a; ┃
┃2) int* a; ┃
┗━━━━━━━┛
1) と 2) は同じ意味である。
変数aは番地(アドレス)を格納するための変数。
つまり、下記のように扱える。
パターン1)
int* a;
int b;
a = &b; /* int型変数bの番地がaに代入される。 */
b = 546;
printf("*a = %d\n", *a);
ポインタ変数の頭に * をつけると番地の内容を示すので、上記のようにすると
*a = 546
と表示される。(変数bと同じ内容)
パターン2)
int* a;
int b[100];
a = &b[0]; /* int型の配列bの先頭アドレスが a に代入される。*/
/* ちなみに、配列は[]を省略すると番地を示すので */
/* a = b */
/* と表記しても同じ。 */