10−2.配列とポインタ

10-1.変数とポインタとの違いに気を付けてください。 ポインタは、変数のアドレスを格納するよりは、配列のアドレスを格納する方がずっと使用頻度は高くなります。

(1)配列とアドレス

(変数)と(配列)の違いに注意してください
(変数)

char a = 123; のとき

a変数 a の値(123)
&a変数 a のアドレス(1000)
(配列)

char a[4] = "ABC"; のとき

a配列 a の先頭要素のアドレス(1000)

a[0]

a[1]

a[2]

a[3]

a[0] の値('A')

a[1] の値('B')

a[2] の値('C')

a[3] の値('\0')

&a[0]

&a[1]

&a[2]

&a[3]

a[0]のアドレス(1000)

a[1]のアドレス(1001)

a[2]のアドレス(1002)

a[3]のアドレス(1003)

このとき a == &a[0]

(参考2)

(2)ポインタの宣言と使い方(配列のアドレスを格納)

ポインタは必ず、

  1. 宣言
  2. 値(アドレス)の設定
  3. 使用

の 3ステップで用います。

配列のアドレスをポインタに設定した場合、配列の各要素をポインタを使ってアクセスすることができます。 この場合、「ポインタの値を変えずにデータを参照」するやり方と、 「ポインタの値そのものを更新してデータを参照」するやり方の2通りがあります。

どちらを選んでもかまいませんが、後者の場合には、ポインタに格納されているアドレスが更新されますので、 後でそのポインタを使おうとしたときに、更新されたことを忘れていると、 思わぬエラーの原因になりますので、注意が必要です。

演習

(3)ポインタのアドレス計算

実は

「ポインタに 1 加える」ということは

「ポインタに格納されているアドレス + 1番地」ではなく

「ポインタに格納されているアドレス + 型のサイズ

ということになります。

つまり、同じ「++p」でも

char型なら サイズ 1バイトなので 1番地

int型なら サイズ 2バイトなので 2番地

long型なら サイズ 4バイトなので 4番地

float型なら サイズ 4バイトなので 4番地

double型なら サイズ 8バイトなので 8番地

アドレスが増えることになります。

何故このようにするのでしょう?それは、型によって増分値を考慮するのは効率が悪いからです。

演習

【参考2】

実は

char str[80];
scanf("%s", str);

は、「配列strの先頭要素のアドレスが示すメモリエリアに入力データを文字列として格納」の意味になります。

また、2次元配列の場合のアドレスは次のように表します。

char str[3][7] = {
	"ABC", "DEFGHI", "JK"
};
str配列 str の先頭要素のアドレス(1000)

str[0]

str[1]

str[2]

str[0] の先頭要素のアドレス(1000)

str[1] の先頭要素のアドレス(1007)

str[2] の先頭要素のアドレス(1014)

&str[0][0]

&str[1][0]

&str[2][0]

str[0][0] のアドレス(1000)

str[1][0] のアドレス(1007)

str[2][0] のアドレス(1014)

str[0][0]

str[1][0]

str[2][0]

str[0][0] の中身('A')

str[1][0] の中身('D')

str[2][0] の中身('J')

このとき str == str[0] == &str[0][0]

戻る

◆◆前ページ  ▲TOP▲  次ページ◆◆

banner
「初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved