配列のポインタとかポインタの配列とか

Cやってて未だにぱっとこないのでメモとして。Ubuntu gcc 4.3.2

int main(){
  {
    long long *a[10];
    printf("sizeof(a)=%d, sizeof(*a)=%d, sizeof(a[0])=%d, sizeof(*a[0])=%d, 
           sizeof(*(a[0]))=%d, sizeof((*a)[0])=%d\n", 
           sizeof(a), sizeof(*a), sizeof(a[0]), sizeof(*a[0]), 
           sizeof(*(a[0])), sizeof((*a)[0]));
    printf("a:%d, a+1:%d, *a:%d, *(a+1):%d, (*a)+1:%d,
           a[0]:%d, a[1]:%d, a[0]+1:%d\n",
           a, a+1, *a, *(a+1), (*a)+1, a[0], a[1], a[0]+1); 
  }

  {
    long long (*a)[10];
    printf("sizeof(a)=%d, sizeof(*a)=%d, sizeof(a[0])=%d, sizeof(*a[0])=%d, 
           sizeof(*(a[0]))=%d, sizeof((*a)[0])=%d\n",
           sizeof(a), sizeof(*a), sizeof(a[0]), sizeof(*a[0]), 
           sizeof(*(a[0])), sizeof((*a)[0]));
    printf("a:%d, a+1:%d, *a:%d, *(a+1):%d, (*a)+1:%d,
           a[0]:%d, a[1]:%d, a[0]+1:%d\n",
           a, a+1, *a, *(a+1), (*a)+1, a[0], a[1], a[0]+1); 
  }
}

出力(適宜改行)

sizeof(a)=40, sizeof(*a)=4, sizeof(a[0])=4, 
sizeof(*a[0])=8, sizeof(*(a[0]))=8, sizeof((*a)[0])=8
a:-1074878052, a+1:-1074878048, *a:0, *(a+1):0, (*a)+1:8,
a[0]:0, a[1]:0, a[0]+1:8

sizeof(a)=4, sizeof(*a)=80, sizeof(a[0])=80, 
sizeof(*a[0])=8, sizeof(*(a[0]))=8, sizeof((*a)[0])=8
a:134520820, a+1:134520900, *a:134520820, *(a+1):134520900, (*a)+1:134520828,
a[0]:134520820, a[1]:134520900, a[0]+1:134520828

前者がポインタの配列。後者が配列へのポインタ。


うーん、こういうのがすぐに反応できるようにならんとダメだなあ・・・。