FromNandの日記

自分的備忘録

「char array[10];」に対して、式中での「array」「&array」の違いについて

昔、初心者書籍で嘘が書かれていたことがあったのでまとめておきます。
タイトルの通り、「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は配列全体を一つの要素としてみた時のポインタ」といえそうです。