ttp://member.nifty.ne.jp/maebashi/programmer/pointer.html より。

<配列→ポインタの読み換え>

式の中では、配列は「先頭要素へのポインタ」に読み換えられる。

int a[10];

の時、式の中では、a と &a[0]は同じ意味となる。

ただし、以下の個所は例外である。

1、sizeof演算子のオペランド

sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。


2、& 演算子のオペランド

& 演算子は、配列全体のアドレスを返す。
配列から読み換えられたポインタは左辺値を持たないため、
& 演算子のオペランドにはならないはずであるが、この例外規則のため、
& でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が 取得できる。
この規則は初心者を混乱させることがある
(例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても 正常に動いてしまう)が、
メリットは今ひとつわからない。


3、初期化時の文字列リテラル

char の「配列」を初期化する場合の文字列リテラルは、
中括弧内に文字を区切って書く初期化子の省略形である。
char の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。