配列のポインタとかポインタの配列とか
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
前者がポインタの配列。後者が配列へのポインタ。
うーん、こういうのがすぐに反応できるようにならんとダメだなあ・・・。