char wday[ ] = "Thursday"; /* 配列の宣言と初期化 */
ここで配列の先頭のアドレスはどうやって表せるでしょうか?
アドレスは「&」を使うと取得できました。配列 wday の先頭の要素は wday[0] です。つまり、配列の先頭のアドレスは &wday[0] となるわけです。実はもう一つ方法があるのです。それは単に配列名をしてするだけ、という方法です。つまり、 wday は配列 wday の先頭のアドレスを指し示しているのです。
よって、下の二つの文は同じことをしていることになります。
char *pary; /* ポインタの宣言 */
pary = &wday[0]; /* A.先頭の要素のアドレスを&で指定 */
pary = wday; /* B.配列名を指定 */
同様に他の要素のアドレスも取得できます。Aのように演算子「&」を使うと次のようになります。
&wday[0] | → | 添字 0 の要素のアドレス |
&wday[1] | → | 添字 1 の要素のアドレス |
・ ・ ・ | ・ ・ ・ | |
&wday[8] | → | 添字 8 の要素のアドレス |
pary | → | ポインタ pary の値 = 添字 0 の要素のアドレス |
pary + 1 | → | ポインタ pary に + 1 した値 = 添字 1 の要素のアドレス |
・ ・ ・ | ・ ・ ・ | |
pary + 8 | → | ポインタ pary に + 8 した値 = 添字 8 の要素のアドレス |
アドレス | データ | 配列で指定した場合 | ポインタで指定した場合 |
---|---|---|---|
1000 | ' T ' | wday[0] | *( pary ) |
1001 | ' h ' | wday[1] | *( pary + 1 ) |
1002 | ' u ' | wday[2] | *( pary + 2 ) |
1003 | ' r ' | wday[3] | *( pary + 3 ) |
1004 | ' s ' | wday[4] | *( pary + 4 ) |
1005 | ' d ' | wday[5] | *( pary + 5 ) |
1006 | ' a ' | wday[6] | *( pary + 6 ) |
1007 | ' y ' | wday[7] | *( pary + 7 ) |
1008 | ' \0 ' | wday[8] | *( pary + 8 ) |
5.ポインタ演算
pary++
とするだけですね。こうするとポインタ pary の値自体が1増加するので、paryの指し示すアドレスは「1001番地」となるわけです。
この状態で前節と同じように参照するには以下の表のようになるわけです。
アドレス | データ | 配列で指定した場合 | ポインタで指定した場合 |
---|---|---|---|
1000 | ' T ' | wday[0] | *( pary - 1 ) |
1001 | ' h ' | wday[1] | *( pary ) |
1002 | ' u ' | wday[2] | *( pary + 1 ) |
1003 | ' r ' | wday[3] | *( pary + 2 ) |
1004 | ' s ' | wday[4] | *( pary + 3 ) |
1005 | ' d ' | wday[5] | *( pary + 4 ) |
1006 | ' a ' | wday[6] | *( pary + 5 ) |
1007 | ' y ' | wday[7] | *( pary + 6 ) |
1008 | ' \0 ' | wday[8] | *( pary + 7 ) |
アドレス | データ | 配列で指定した場合 | ポインタで指定した場合 |
---|---|---|---|
1000 | 100 | dat[0] | *( pary ) |
1001 | |||
1002 | 35 | dat[1] | *( pary + 1 ) |
1003 | |||
1004 | -68 | dat[2] | *( pary + 2 ) |
1005 | |||
1006 | 238 | dat[3] | *( pary + 3 ) |
1007 |