配列とポインタ

http://d.hatena.ne.jp/heiwaboke/20091012/1255275804の話。
別の場所で教えた内容をちょっと引っ張ってみる。

前提として。

  • 配列とポインタは違う。
  • アドレスだけではなく、型も考慮するべき。
  • 譬え話ではなく、仕様書を読もう。

具体的には。

#include <stdio.h>

#define DUMP(FMT,VAL) printf("%-16s = "FMT "\n", #VAL, (VAL))

int main()
{
    char const arr[2] = "a";
    char const* ptr = "a";

    DUMP("%p", arr);
    DUMP("%p", &arr);
    DUMP("%p", &arr[0]);

    DUMP("%p", arr+1);
    DUMP("%p", &arr+1);
    DUMP("%p", &arr[0]+1);
    
    DUMP("%d", sizeof(arr));
    DUMP("%d", sizeof(&arr));
    DUMP("%d", sizeof(&arr[0]));

    DUMP("%p", ptr);
    DUMP("%p", &ptr);
    DUMP("%p", &ptr[0]);

    DUMP("%p", ptr+1);
    DUMP("%p", &ptr+1);
    DUMP("%p", &ptr[0]+1);
    
    DUMP("%d", sizeof(ptr));
    DUMP("%d", sizeof(&ptr));
    DUMP("%d", sizeof(&ptr[0]));

    return 0;
}

↑の結果が↓となる。

arr              = 0xbfeee752
&arr             = 0xbfeee752
&arr[0]          = 0xbfeee752
arr+1            = 0xbfeee753
&arr+1           = 0xbfeee754
&arr[0]+1        = 0xbfeee753
sizeof(arr)      = 2
sizeof(&arr)     = 4
sizeof(&arr[0])  = 4
ptr              = 0x80486c0
&ptr             = 0xbfeee74c
&ptr[0]          = 0x80486c0
ptr+1            = 0x80486c1
&ptr+1           = 0xbfeee750
&ptr[0]+1        = 0x80486c1
sizeof(ptr)      = 4
sizeof(&ptr)     = 4
sizeof(&ptr[0])  = 4

〆。

では仕様書の該当個所を読んでくれ。