int a[] = "abcdef";
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a+0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(&a+1));
printf("%d\n", sizeof(&a[0]+1))
char a[] = "abcdef";
sizeof(a) 末尾存在\0,大小为7
sizeof(a+0) a是首元素地址,a+0还是首元素的地址,大小是4或者8
sizeof(*a) a是首元素地址,*a是首元素,即‘a’,大小为1
sizeof(a[1]) a[1]是数组第二个元素,即‘a’,大小为1
sizeof(&a) &a取得是整个数组的地址,大小为4或者8
sizeof(&a+1) &a取得是整个数组的地址,+1表示向后跳过整个数组产生的一个地址,大小为4或者8
sizeof(&a[0]+1) &a[0]表示第一个元素的地址,+1表示第二个元素地址,大小4或者8
char* p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&a[0]+1))
char* p = "abcdef"
sizeof(p) p是指针变量,指针变量大小为4或者8
sizeof(p+1) p是首元素地址,p+1是第二个元素的地址,大小是4或者8
sizeof(*p) *p是首元素,即‘a’,大小为1
sizeof(p[0]) p[0]是数组第二个元素,即‘a’,大小为1
sizeof(&p) &p取得是指针变量p的地址,大小为4或者8
sizeof(&p+1) &p取得是指针变量p的地址,+1表示向后跳过p的地址,仍为一个地址,大小为4或者8
sizeof(&p[0]+1) &p[0]表示第一个元素的地址,+1表示第二个元素地址,大小4或者8
int a[3][4]={0};
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a[0][0]));
printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a[0]+1));
printf("%d\n", sizeof(*(a[0]+1)));
printf("%d\n", sizeof(a+1));
printf("%d\n", sizeof(*(a+1)));
printf("%d\n", sizeof(&a[0]+1));
printf("%d\n", sizeof(*(&a[0]+1)));
printf("%d\n", sizeof(*a);
printf("%d\n", sizeof(a[3]));
int a[3][4]={0}
sizeof(a) a单独放在sizeof内部,计算的是整个数组的大小,大小为3*4*4=48
sizeof(a[0][0]) 第一行第一个元素的大小
sizeof(a[0]) a[0]是第一行的数组名,单独放在sizeof内部,大小为4*4=16
sizeof(a[0]+1) a[0]表示第一行首元素地址,+1表示第一行第二个元素地址,4或者8
sizeof(*(a[0]+1)) 第一行第二个元素,大小为4个字节
sizeof(a+1) a表示首元素地址,首元素地址就是第一行的地址,+1变成第二行地址大小为4或者8
sizeof(*(a+1)) 对第二行地址解引用,访问的是第二行,大小为16sizeof(&a[0]+1) 第一行地址+1为第二行地址
sizeof(*a) a为首元素地址,为第一行地址,解引用为第一行,大小为16
sizeof(a[3]) 类型为int[4],大小为16