前提:当数组名在 sizeof 中单独存放时,数组名表示整个数组, 当数组名单独与&结合时也表示为整个数组,除此自外的数组名都是首元素地址
看几个经典的例子(然后其他的各位可以当练习进行):
看第一个printf 处 sizeof(a); 此处a单独放入sizeof中,表示整个a数组,因此大小为48
看第三个printf处sizeof(a[0]); 此处将 a[0]单独放入sizeof中,表示的是整个a[0]这一列的数组,因此大小为4*4 = 16
看第四个printf处sizeof(a[0]+1); 此处a[0]并没有单独存放sizeof,也没有单独与&相连,因此表示a[0]这一列的元素的首地址 (即 a[0][0]的地址) 因此a[0]+1为 a[0][1]的地址,又由于是地址,因此大小为4/8
看第六个printf处sizeof(a+1); 此处的a并没有单独放入sizeof,也没有单独与&相连,因此表示a这个数组的首元素(a的第一行的地址即第一列a[0]的地址) 因此a+1为第二列的地址,即a[1]的地址(相当于&a[1]),又由于是地址,因此大小为4/8
看第七个printf处的sizeof(*(a+1) ) 由上一条可知,a+1此处是第二行的地址,因此解引用,后为整个数组a的第二行,因此是16个字节
看第八个printf处的sizeof(&a[0]+1) 此处的a[0]与&结合,因此此处a[0]表示的为整个a的第一行,所以&a[0]为取出a第一行的地址,因此&a[0]+1表示为数组a的整个第二行的地址(相当于&a[1])