sizeof和数组的那些事。

一、sizeof

首先sizeof是一个关键字而不是函数。

int a = 6;
sizeof a//使用时可以不加括号,因此是关键字,输出为int类型的长度

如果sizeof内是一个表达式,这个表达式是不会进行运算的,最后输出的结果是该表达式最后结果的类型。在下面代码块中第二行的sizeof内的表达式 b=a+3不会真正运算,输出的是表达式内b类型的长度。

short b = 3;
printf("%d",sizeof(b = a+3));//输出的是b的类型长度,即short类型的长度
printf("%d", b);  //仍然输出3

二、数组

下列代码中都打印出什么?如果能够轻松的知道打印内容那说明对数组和sizeof掌握的比较好。

int arr[10];
printf("%d\n",sizeof(&arr)); 
printf("%d\n",sizeof(*&arr));
printf("%d\n",sizeof(&arr+1));

int a[3][4] = {0};
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1)); //第一行第二个元素(下标是arr[0][1])的地址。
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));

在数组使用中有以下几个原则:

1、sizeof(数组名)计算的是整个数组的大小(单位是字节),数组名需单独放在sizeof内;

2、&数组名 表示整个数组,取出的是整个数组的大小,&数组名+1 会跳过整个数组;

3、除上述2种情况外,其他任何时候数组名都表示首元素地址;

4、以int arr[10]为例:去掉数组名和数组个数int 就是数组元素的类型;去掉数组名就是数组的类型 int [10]。

5、对于二维数组来说第一个元素是第一行。第一行可以看作一维数组,这个数组名称是arr[0],即arr[0]也是数组名,但是arr[0]+1是第一行第二个元素(下标是arr[0][1])的地址。

int a[3][4];
printf("%d\n", sizeof(a));//输出整个数组的大小即3*4*4=48
printf("a = %p,&a = %p\n", a, &a);//输出的值是一样,但是含义不一样
printf("a = %p,&a = %p\n", a + 1, &a + 1);//a+1跳过二维数组第一行的地址,&a+1跳过整个数组的地址

回到上面的问题。

int arr[10];
printf("%d\n",sizeof(&arr)); //取的是整个数组的地址,在32位下是打印4,64位下打印8
printf("%d\n",sizeof(*&arr));//取出整个数组的地址,然后解引用,所以拿到的是整个数组,打印40.相当于sizeof(arr)
printf("%d\n",sizeof(&arr+1));//&arr+1跳过整个数组,但仍然是个地址,在32位下是打印4,64位下打印8。int a[3][4] = { 0 };
printf("%d\n", sizeof(a[0]));   
//a[0]是第一行的数组名,sizeof数组名是整个数组的大小,打印16

printf("%d\n", sizeof(a[0] + 1)); 
//数组名+1跳到第一行第二个元素的地址,在32位下打印4,64位打印8

printf("%d\n", sizeof(*(a[0] + 1)));
//取出第一行第二个元素,类型是int,打印4

printf("%d\n", sizeof(a + 1));
//是第二行的地址,在32位下打印4,64位打印8

printf("%d\n", sizeof(*(a + 1)));
//取出第二行,打印16

printf("%d\n", sizeof(&a[0] + 1));
//第二行的地址,打印4或8

printf("%d\n", sizeof(*(&a[0] + 1)));
//取出第二行,打印16

printf("%d\n", sizeof(*a));
//取出首行,打印16

printf("%d\n", sizeof(a[3]));
//16,这里的a[3]已经越界了,但由于sizeof不会进行运算所以不会报错,而是把a[3]仍看做数组一部分,打印“第四行”的大小,即16

最后祝大家平安,身体是革命的本钱,拥有健康的身体才有无限的可能。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值