昔、初心者書籍で嘘が書かれていたことがあったのでまとめておきます。
タイトルの通り、「char array[10];」に対しての「array」と「&array」の意味するものは全く異なります。
結論から言ってしまうと、「arrayはchar*」で「&arrayはchar(*)[10]」という意味になります。
実験コードを載せておきます。
「array」と「&array[0]」は式中で同じ意味になります。
#include<stdio.h> int main(void){ char array[10]; char *p1 = array; char *p2 = &array[0]; char (*p3)[10] = &array; printf("p1 = %p, p2 = %p, p3 = %p\n", p1, p2, p3); printf("p1 + 1 = %p, p2 + 1 = %p, p3 + 1 = %p\n", p1 + 1, p2 + 1, p3 + 1); printf("p1 + 2 = %p, p2 + 2 = %p, p3 + 2 = %p\n", p1 + 2, p2 + 2, p3 + 2); return 0; }
実行結果は次のようになりました。
p1 = 0xff8b50e2, p2 = 0xff8b50e2, p3 = 0xff8b50e2 p1 + 1 = 0xff8b50e3, p2 + 1 = 0xff8b50e3, p3 + 1 = 0xff8b50ed p1 + 2 = 0xff8b50e4, p2 + 2 = 0xff8b50e4, p3 + 2 = 0xff8b50f8
イメージとしては、「arrayは配列の先頭を指すポインタ」で「&arrayは配列全体を一つの要素としてみた時のポインタ」といえそうです。