一、字符串数组
char* p = " abcdef ",p是一个指针变量,存放的是数组首元素a的地址。
1.sizeof(p),计算的是一个指针变量的大小,为4(32位平台)或8(64位平台)。
2.sizeof(p+1),p+1也是一个指针变量,其大小为4或8。
3.sizeof(*p),对p进行解引用操作,得到第一个元素,其大小为1。
4.sizeof(p[0]),p[0]相当于*(p+0),因此计算的是第一个元素大小,为1。
5.sizeof(&p),&p取出的是p的地址,计算的是地址的大小,为4或8。
6.sizeof(&p+1),&p+1是跳过p的地址,计算的还是地址的大小,为4或8。
7.sizeof(&p[0]+1),p[0]表示的是第一个元素,&p[0]取出第一个元素的地址,加1表示第二个元素的地址,计算的是地址的大小,为4或8。
8.strlen(p),计算整个字符串的长度,为6。
9.strlen(p+1),计算的是从第二个元素开始到'\0'之间的长度,为5。
10.strlen(*p)和strlen(p[0])这种写法是错误的。
11.strlen(&p),&p取出的是p的地址,但是内存上放的是什么并不知道,因此返回值为随机值。
12.strlen(&p+1),同11,为随机值。
13.strlen(&p[0]+1),&p[0]+1表示的是第二个元素的地址,计算的是从第二个元素开始到'\0'之间的长度,为5。
二、二维数组
1.sizeof(a),计算整个数组的大小,为3*4*sizeof(int)=48。
2.sizeof(a[0][0]),计算第一个元素的大小,为4。
3.sizeof(a[0]),a[0]可以理解为第一行的数组名,计算的是整个第一行的大小,因此为16。
4.sizeof(a[0]+1),a[0]作为数组名没有单独放在sizeof内部,也没有取地址,因此a[0]就是第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址,计算的就是地址的大小,为4或8。
5.sizeof(*(a[0]+1)),a[0]+1是第一行第二个元素的的地址,所以*(a[0]+1)取出的就是第一行第二个元素,计算的是第一行第二个元素的大小,为4。
6.sizeof(a+1),a表示的是第一行的地址,a+1表示的就是第二行的地址,计算地址的大小,为4或8。
7.sizeof(*(a+1)),a+1是第二行的地址,*(a+1)表示整个第二行,计算的就是第二行的大小,为16。
8.sizeof(&a[0]+1),a[0]是第一行的数组名,&a[0]取出的是第一行的地址,加1就是第二行的地址,计算的是地址的大小,为4或8。
9.sizeof(*(&a[0]+1)),计算第二行的大小,为16。
10.sizeof(*a),a为首元素的地址,即第一行的地址,所以*a就是第一行,大小为16。
11.sizeof(a[3]),a[3]其实是第四行的数组名(如果有的话),所以其实是不存在的,但也能通过类型计算大小,因此为16。