C语言中 sizeof 与一维数组和二维数组

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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值