【C语言】运算符——sizeof


一、定义

sizeof是C语言中的运算符,并不是函数用于在编译时确定类型(直接将大小计算结果嵌入生成的代码中,不会引起运行时开销。)或变量的大小(以字节为单位)它的结果类型是 ‘size_t’,这是一个定义在 <stddef.h>文件中的无符号整数类型,专门用于表示对象的大小。‘sizeof’ 运算符在C语言中有许多应用,理解其用法对于编写高效和正确的C代码至关重要。

二、用法及其注意事项

1.基本数据类型大小计算

#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("Size of int: %zu\n", sizeof(int)); // 通常输出4
	printf("Size of char: %zu\n", sizeof(char)); // 通常输出1
	printf("Size of int: %zu\n", sizeof(float)); // 通常输出8
	printf("Size of char: %zu\n", sizeof(double)); // 通常输出8
	return 0}

注意:数据类型大小并不是固定的,它由操作系统决定的,例如在64位系统中long类型大小为8字节,而在32位系统中long类型大小为4字节。


2.指针大小计算

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int *ptr;
	printf("Size of pointer: %zu\n", sizeof(ptr));  // 通常输出8(在64位系统上)
	return 0}

注意:指针大小也并不是固定的,它由操作系统决定的,例如在64位系统中大小为8字节,而在32位系统大小为4字节。


3.变量大小计算

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int x;
	printf("Size of x: %zu\n", sizeof(x));  // 输出变量x的大小,例如4(如果x是int类型)
}

注意:变量的大小计算,是根据变量类型确定的,如上面的代码,由于变量x为int类型,因此大小为4字节。


4.数组大小计算

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int array[10];
	printf("Size of array: %zu\n", sizeof(array));  // 输出数组总大小,例如40(10个int,每个int通常4字节)
	printf("Size of elements: %zu\n", sizeof(array[0]));  // 输出数组元素大小
	printf("Number of elements in array: %zu\n", sizeof(array) / sizeof(array[0]));  // 计算数组的元素个数
	return 0}

注意:在用sizeof计算数组大小时,可以用数组名计算,但是数组名作为函数参数进行传递的时候会被隐式转换为指针,这时候在函数内部使用sizeof计算函数名时,得到的并不是数组的大小而是指针的大小,同时可以使用sizeof计算数组元素大小以及数组元素个数。


5.函数大小计算

#include <stdio.h>
#include <stdlib.h>

int f1() 
{
	return 0;
};
double f2() 
{ 
	return 0.0; 
};
void f3()
{
};

int main() 
{
	printf("%d   \n", sizeof(f1())); 		// f1()返回值为int,因此被认为是int
	printf("%d   \n", sizeof(f2())); 		// f2()返回值为double,因此被认为是double


	//printf("%d   \n", sizeof(f3())); 		// 错误!无法对void类型使用sizeof
	//printf("%d   \n", sizeof(f1));   		// 错误!无法对函数指针使用sizeof
	//printf("%d   \n", sizeof(*f2));  		// *f2,和f2()等价,因为可以看作object,所以括号不是必要的。被认为是double
	return 0;

}

注意:函数返回什么类型的数据,就按这个数据类型计算。具体是:sizeof(函数名()),相当于调用这个函数的结果,并计算占用空间大小,注意传入的是函数名()而不是函数名(因为函数名是指针)。


6.结构体和联合体等大小计算

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int a;
    char b;
} MyType;

int main() 
{
	printf("Size of MyType: %zu\n", sizeof(MyType)); 
	return 0;
}

注意:结构体的大小可能由于成员的对齐和填充而比各成员大小总和更大,具体的内存对齐的规则可以查看这篇文章: 【C语言】结构体与联合体之间的“爱恨情仇”

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言运算符的优先级如下所示: 1. 后缀运算符:() \[\] -> 2. 一元运算符:++ -- + - ! ~ (type)* & sizeof 3. 乘除余运算符:* / % 4. 加减运算符:+ - 5. 移位运算符:<< >> 6. 关系运算符: < <= > >= 7. 相等运算符:== != 8. 位与运算符:& 9. 位异或运算符:^ 10. 位或运算符:| 11. 逻辑与运算符:&& 12. 逻辑或运算符:|| 13. 条件运算符:?: 14. 赋值运算符:= += -= *= /= %= >>= <<= &= ^= |= 15. 逗号运算符:, 需要注意的是,运算符的优先级决定了它们在表达式中的计算顺序。在表达式中,较高优先级的运算符会优先被计算。例如,对于表达式e = (a + b) * c / d,先计算括号内的加法,然后乘法,最后除法。\[1\]\[2\] 另外,C语言中还有一些特殊的运算符,如sizeof运算符用于获取变量或类型的大小,逗号运算符用于依次计算多个表达式并返回最后一个表达式的值。\[2\] 总结起来,C语言运算符的优先级可以根据上述优先级表来确定,根据需要可以使用括号来改变运算的顺序。\[2\] #### 引用[.reference_title] - *1* *2* [C语言——运算符优先级](https://blog.csdn.net/liu17234050/article/details/104176911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【C语言基础】-运算符](https://blog.csdn.net/weixin_44247448/article/details/124077281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值