sizeof与一维数组和二维数组

1.sizeof的说明
sizeof在C语言里面属于操作符,不属于函数,和变量的++,–属于同样的操作符。sizeof后面的括号里面,可以放类型名,数组名等内存大小确定的类型,不能计算函数名,可变数组的内存大小等
1.一维数组

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
main()
{
	int a[] = {1,2,3,4};               结果
    printf("%d\n",sizeof(a));           16
    printf("%d\n",sizeof(a+0));         4
    printf("%d\n",sizeof(*a));          4
    printf("%d\n",sizeof(a+1));         4
    printf("%d\n",sizeof(a[1]));        4
    printf("%d\n",sizeof(&a));          4
    printf("%d\n",sizeof(&a+1));        4
    printf("%d\n",sizeof(&a[0]));       4
    printf("%d\n",sizeof(&a[0]+1));     4
    system("pause");    
    return 0;
}

a代表数组的起始地址,也就是数组a的0号位元素的内存起始地址,a+0代表指针a偏移0,因此指向的还是数组的起始地址,所以a=&a=a+0=&a[0],虽然他们的数值相等,都表示数组起始地址,但他们的意义不同。
2.二维数组

int main()
{
	int a[3][4] = {0};                      结果
    printf("%d\n",sizeof(a));               48
    printf("%d\n",sizeof(a[0][0]));        4
    printf("%d\n",sizeof(a[0]));           16
    printf("%d\n",sizeof(a[0]+1));        4
    printf("%d\n",sizeof(a+1));            4
    printf("%d\n",sizeof(&a[0]+1));     4
    printf("%d\n",sizeof(*a));               16
    printf("%d\n",sizeof(a[3]));            16
   system("pause");    
    return 0;
}

a代表了二维数组的起始地址,&a在内存上和a表示的是同一个地方,还是二维数组的起始地址,因此用sizeof计算它们的值,就是整个二维数组所占用的内存空间。那么,a,a[0],a+0,&a[0],&a[0][0],(a+0),这些都代表什么呢?我们可以用下面这个图来描述二维数组a:

sizeof(a)表示整个二维数组的大小,a表示(a+0),所以,*a表示一维数组的首地址,因此sizeof(a)是4sizeof(int)为16;

a[0]也就是*(a+0),和a一样,也是指向一维数组的首地址,因此a[0],(a+0)用sizeof计算内存大小,就是4*sizeof(int)为16;

&a[0]就是&((a+0)),&和互相抵消,因此相当于a+0,数组名参与了指针偏移运算,因此sizeof(&a[0])的大小为指针的内存大小,是4字节。&a[0][0]就是&((a+0)+0)),&和抵消以后,为(a+0)+0,(a+0)代表一维数组的首地址,因此(a+0)+0表示数组首地址参与偏移操作,成为指向数组{1,3,5,7}0号位元素1的指针,sizeof(&a[0][0])的大小4 ;

我们总结为一句话,不论是一维数组,还是二维数组,如果直接
sizeof数组名,那么大小为整个数组所占用的内存空间,如果计算类似a+0,a+1等数组名进行了偏移运算,那么它就代表指向某个元素的指针,sizeof计算的话,其大小为指针的内存大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ashley zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值