c语言中sizeof()用法的详解

sizeof用法的详细解释

sizeof的定义

sizeof是C语言和C++的关键字和操作符,sizeof 不是操纵符,也不是函数,因为在运行阶段没有它,它没有被编译成机器指令。它的作是用来计算变量(或数据类型)在当前系统中占用内存的字节数。sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。

sizeof的语法

求数组的大小: sizeof(arr) 后面的括号也可以省略
例如 sizeof arr 或者sizeof(arr)这两种方法都是可以的,这种方法只能够用于变量名,
不能用于类型名 sizeof int这种方式就是错误的,编译器会报错

c语言中sizeof()用法的详解_第1张图片

下面的输出控制台也会报错c语言中sizeof()用法的详解_第2张图片
sizeof后面,也可以跟类型名,但是需要用括号括起来

c语言中sizeof()用法的详解_第3张图片

代码样例

这里用代码来解释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

c语言中sizeof()用法的详解_第4张图片

但是在x64的环境下运行结果就是8

c语言中sizeof()用法的详解_第5张图片

用代码举例子更方便理解

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;
}

上面代码的运行结果截图是
c语言中sizeof()用法的详解_第6张图片
这里来解释一下为什么是上面的结果

	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来计算

你可能感兴趣的:(c语言,开发语言)