sizeof用法的详细解释
sizeof的定义
sizeof是C语言和C++的关键字和操作符,sizeof 不是操纵符,也不是函数,因为在运行阶段没有它,它没有被编译成机器指令。它的作是用来计算变量(或数据类型)在当前系统中占用内存的字节数。sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。
sizeof的语法
求数组的大小: sizeof(arr) 后面的括号也可以省略
例如 sizeof arr 或者sizeof(arr)这两种方法都是可以的,这种方法只能够用于变量名,
不能用于类型名 sizeof int这种方式就是错误的,编译器会报错
下面的输出控制台也会报错
sizeof后面,也可以跟类型名,但是需要用括号括起来
代码样例
这里用代码来解释sizeof具体情况的具体用法
首先这里先解释一下数组名有哪些含义:
1.数组名是首元素的地址
但是这里有两个需要注意的点是:
(1).sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位字节
(2).&数组名,数组名表示整个数组,取出的是数组的地址
这里说明一下,如果是地址的话,那么它的大小就是占用内存4或者8个字节
不管你是char*,还是int*,还是float*等等,这些都是占用4或者8个字节,只不过是因为操作系统环境的不同,看下面的代码:
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr + 0));
return 0;
}
同样的代码,在不同环境下运行的结果也是不同的
例如在x86的环境下运行的结果是4
但是在x64的环境下运行结果就是8
用代码举例子更方便理解
int main()
{
int a[] = { 1,2,3,4 };
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof(a + 0));
printf("%zd\n", sizeof(*a));
printf("%zd\n", sizeof(a + 1));
printf("%zd\n", sizeof(a[1]));
printf("%zd\n", sizeof(&a));
printf("%zd\n", sizeof(*&a));
printf("%zd\n", sizeof(&a + 1));
printf("%zd\n", sizeof(&a[0]));
printf("%zd\n", sizeof(&a[0] + 1));
return 0;
}
上面代码的运行结果截图是
这里来解释一下为什么是上面的结果
int a[] = { 1,2,3,4 };
printf("%zd\n", sizeof(a));//16
这里这在上面有解释过sizeof(数组名) 就是整个数组的地址,这个数组有4个元素,每个元素是int类型的,占用4个字节的空间,所有就是4*4=16个字节
而下面的代码
int a[] = { 1,2,3,4 };
printf("%zd\n", sizeof(a + 0));//4或者8
a就是数组首元素的地址 是地址就是4/8个字节
数组名没有单独放在sizeod内部
a+0======&a[0]
printf("%zd\n", sizeof(*a));//4 a就是数组首元素的地址
//*a其实就是第一个元素,也就是a[0]
printf("%zd\n", sizeof(a + 1));//4 等价于第二个元素的地址
printf("%zd\n", sizeof(a[1]));//4 第二个元素的大小
printf("%zd\n", sizeof(&a));//4 取出的是数组的地址,但是数组的地址也是地址
//是地址,大小就是4或8个字节
printf("%zd\n", sizeof(*&a));//16 &a是数组的地址
printf("%zd\n", sizeof(&a + 1));//4 &a+1是跳过整个数组后的地址 是地址就是4或8个字节
printf("%zd\n", sizeof(&a[0]));//4 首元素地址
printf("%zd\n", sizeof(&a[0] + 1));//4 第二个元素的地址
这里需要注意
用sizeof计算数组的大小时,不管数组中是否存在数据,sizeof都是根据数组的大小进行计算数组所占的空间大小,而不是根据数组内的数据的个数。同时需要注意的是如果想要知道数组内数据的个数时,用数组空间的大小除一个数据的大小,sizeof(数组名) / sizeof(数组元素)
而字符数组的大小一般都是用strlen来计算