sizeof与数组的关系,之前困惑了很久,搞清楚后在这里记录一下,防止后面再遗忘了。
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[2][3]= { 0 };
printf("sizeof(a)= %d\n",sizeof(a));
//对数组名用sizeof表示求这个数组在内存中所占空间总的大小,结果为4*10=40
printf("sizeof(a[0])= %d\n", sizeof(a[0]));//求数组第一个元素的大小,结果为4
printf("sizeof(*a)= %d\n", sizeof(*a)); //这里需明白数组名表示的是数组第一个元素的首地址
//即a=&a[0],所以*a=a[0],结果同sizeof(a[0]),也为4
printf("sizeof(&a[0])= %d\n", sizeof(&a[0]));//表示求元素a[0]的地址所占空间大小,
//或者说求在本64位编译系统(VS2017 x64)中用多少字节来表示一个地址,结果为8
//而对32编译系统(VS2017 Win32)结果则为4
printf("sizeof(&a[1])= %d\n", sizeof(&a[1]));//表示求元素a[1]的地址所占空间大小,结果也为8
//对于64位的编译系统,恒用8个字节表示一个地址,即求地址的sizeof恒为8
printf("*(&a[1]+1)= %d\n", *(&a[1]+1));//对于地址的加减,其移动的大小取决于地址中元素的大小
//这里地址&a[1]中的元素a[1]为4个字节,故加1后向后移动四个字节,其内容为a[2],结果为3。
printf("*(&a[1]-1)= %d\n", *(&a[1]-1));//在地址&a[1]基础上向前移动四个字节,结果为a[0]=1。
printf("sizeof(&a[1]+1)= %d\n", sizeof(&a[1]+1));
//&a[1]+1 表示元素a[2]的地址,即&a[2],求地址的sizeof结果恒为8
printf("sizeof(a+1)= %d\n\n", sizeof(a+1));//数组名表示的是数组第一个元素的地址(即a=&a[0])
//加1后向后移动4个字节即a+1 = &a[1],求其sizeof结果为8
//对于二维数组首先要明白二维数组b[M][N]会被系统解释为长度为M一维数组
//然后这个一维数组的每个元素又是长度为N的一维数组。
//如元素b[0][N]为长度为N的一维数组,b[0]是该数组的数组名。所以二维数组又称为数组的数组
printf("sizeof(b)= %d\n", sizeof(b));//对二维数组名用sizeof表示求这个数组在内存中
//所占空间总的大小,结果为(2*3)*4=24
printf("sizeof(b[0][0])= %d\n", sizeof(b[0][0]));//求二维数组中第一个元素的大小
//(通常意义上的第一,并不是系统理解的第一个元素为b[0]),其类型为int,结果为4
printf("sizeof(b[0])= %d\n", sizeof(b[0]));//b[0]被系统解释为长度为3的一维数组
//b[0]为该数组的数组名,对数组名用sizeof表示求这个数组总的大小,结果为3*4=12
printf("sizeof(b[1])= %d\n", sizeof(b[1]));
//b[1]同样被系统解释为长度为3的一维数组,b[1]为该数组的数组名,结果为3*4=12
printf("sizeof(b[0]+1)= %d\n", sizeof(b[0]+1));//数组名表示数组第一个元素的首地址
//所以b[0]=&b[0][0]。地址的加减,其移动大小取决于地址中元素b[0][0]的大小(为4个字节)
//地址&b[0][0]往后移动4个字节为地址&b[0][1]。所以b[0]+1=&b[0][1],求其sizeof结果为8
printf("sizeof(b+1)= %d\n", sizeof(b+1));//数组名表示数组第一个元素的首地址,所以b=&b[0]。
//地址的加减,其移动大小取决于地址中元素b[0]的大小(为12个字节)
//地址&b[0]往后移动12个字节为地址&b[1]。所以b+1=&b[1],是一个地址,求其sizeof结果为8
printf("sizeof(*b)= %d\n", sizeof(*b));//b=&b[0],所以*b=b[0],同sizeof(b[0]),结果为12