c语言中sizeof()的特点及用法

本文深入解析C/C++中sizeof运算符的功能与使用方法,包括其语法形式、注意事项及特殊应用场景,如计算不同类型变量的字节长度、数组长度及结构体布局。

        定义:sizeof是计算对象所占的字节数,通常用来查看变量、数组或结构体等所占字节个数的操作运算符。

     形式:sizeof()有三种语法形式:
1)用于数据类型:sizeof(type_name);//sizeof(类型);
2)用于变量:sizeof(object);//sizeof(对象);sizeof object;//sizeof 对象;
例:void main()
{
    int a=10;
    int x=sizeof(a);   
    x=sizeof(int);      
    x=sizeof a;         
    x=sizeof int;        ×
}

以上的四种语法形式中前三种sizeof()的表达是正确的,第四种是错误的,类型必须得加上括号。
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。
     特点及用法: 1)sizeof是运算符,不是函数;
2)sizeof不能求void类型的长度;
3)sizeof可以求void类型的指针的长度;
4)sizeof能求得静态分配内存的数组的长度;注意:用sizeof求字符串的长度时要加上末尾的'/0'
例:void fun(int array[10])
{
    int n=sizeof(array);
    return n;
}
运行结果:4
在fun类n的值为4,而不是40,这是因为在函数参数传递时,数组被转化成指针了,假如直接传递整个数组的话,那么必然涉及到数组元素的拷贝(实参到形参的拷贝),当数组非常大时,会导致函数执行效率极低,而只传递数组的地址(即指针),只需要拷贝4byte。
5)sizeof不能对不完整的数组求长度,否则会编译错误;
6)当表达式作为sizeof的操作数时,它返回的是表达式计算结果的类型大小,但是它不对表达式求值;
7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型(函数类型)的大小,但不是执行函数体;
8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和;
规则:a、结构体的大小等于结构体内最大成员大小的整数倍;
           b、结构体内的成员的首地址相对于结构体的首地址的偏移量是其类型的整数倍,比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数;
           c、为了满足规则a、b,编译器会在结构体成员之后进行字节填充;
例:#include
      using namespace std;
      int main()
 {
      struct  A
    {
      int num1=0;
      int name2=0;
      double num3=0;
    };
       struct B
     {
      int n1=0;
      double n2=0;
      int n3=0;
    };
      cout<<"A="<<sizeof(A)<<endl;
      cout<<"B="<<sizeof(B)<<endl;
      system("pause");
      return 0;
}
运行结果:
A=16
B=24
//分析:sizeof(A):4+4+8=16
             sizeof(B):4(n1占用地址空间)+4(不够8的倍数填充4个地址空间)+8(n2占用地址空间)+4(n3占用地址空间)+4(不够8的倍数填充4个地址空间)=24;
9)sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小;




### C语言中 `sizeof` 运算符的使用方法 #### 1. 基本概念 `sizeof` 是C语言中的一个单目操作符,用于返回操作数在内存中占用的字节数。操作数可以是一个数据类型或变量,其大小由编译器和目标平台决定[^3]。 #### 2. 使用形式 `sizeof` 的使用形式有两种: - **用于基本数据类型**:`sizeof(type)`,其中 `type` 必须用括号括住,例如 `sizeof(int)`。 - **用于变量**:`sizeof(var_name)` 或 `sizeof var_name`,变量名可以不加括号。 #### 3. 示例代码 以下是一些常见的 `sizeof` 使用示例: ```c #include <stdio.h> int main() { // 3.1 基本数据类型的大小 printf("len_int = %d, len_short = %d, len_double = %d, len_char = %d\n", sizeof(int), sizeof(short), sizeof(double), sizeof(char)); // 输出示例:len_int = 4, len_short = 2, len_double = 8, len_char = 1 [^3] // 3.2 变量的大小 int a = 10; short b = 20; double c = 9999.99; char d = 'a'; int e[3] = {1, 2, 3}; int f[] = {1, 2, 3}; char g[] = {'a', 'b', 'c'}; printf("a = %d, b = %d, c = %d, d = %d, e = %d, f = %d, g = %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(d), sizeof(e), sizeof(f), sizeof(g)); // 输出示例:a = 4, b = 2, c = 8, d = 1, e = 12, f = 12, g = 3 [^3] return 0; } ``` #### 4. 高级应用 - **结构体中的 `sizeof`**:`sizeof` 可以用于计算结构体的总大小,但需要注意结构体对齐的影响[^2]。 - **数组中的 `sizeof`**:对于固定大小的数组,`sizeof` 返回整个数组占用的字节数。例如,`int arr[5]; sizeof(arr)` 将返回 `5 * sizeof(int)`。 #### 5. 注意事项 - `sizeof` 在编译时计算,因此无法用于动态分配的内存。 - 对于指针变量,`sizeof` 返回的是指针本身的大小,而不是它指向的数据的大小[^3]。 ```c int *ptr = NULL; printf("Size of pointer: %zu\n", sizeof(ptr)); // 输出指针大小,通常为4或8字节 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值