一、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
最后祝大家平安,身体是革命的本钱,拥有健康的身体才有无限的可能。