Sizeof ---最冤枉的关键字

本文深入解析C/C++中sizeof运算符的功能与使用方法,对比strlen()的区别,并介绍sizeof在指针及静态数组上的应用。

    sizeof()功能:计算数据空间的字节数;

    sizeof是关键字不是函数,其实就算不知道它是否为32个关键字之一时,我们也可以借助编译器确定它的身份。

    看下面的例子:

 

    ;int i = 0;

    A) sizeof(int); B)sizeof(i) C)sizeof int D)sizeof i;

 

 

    毫无疑问,32位系统下 A ,B的值为 4。 在32位系统下,通过Visual C ++ 6.0或任意一编译器调试,我们发现D的结果也是4。Sizeof后面的括号呢? 没有括号居然也可,那想想,函数名后面没有括号行吗?由此轻易得出sizeof绝非函数。


    好,再看C)。编译器怎么提示出错呢?不是说sizeof是个关键字,其后面的括号可以没有么?那你想想sizeof int表示什么啊?Int前面加一个关键字?类型扩展?明显不正确,我们可以在int前加unsigned,const等关键字但不能加sizeof。好,记住:sizeof在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。一般情况下,咱也别偷这个懒,乖乖的写上括号,继续装作一个“函数”,做一个“披着函数皮的关键字”。做我的关键字,让人家认为是函数去吧。

 

***********************************************************************************************

转的一些:

sizeof()功能:计算数据空间的字节数
1.与strlen()比较
      strlen()计算字符数组的字符数,以"/0"为结束判断,不计算为'/0'的数组元素。
      而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
2.指针与静态数组的sizeof操作
      指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。
注意:int *p; sizeof(p)=4;
                  但sizeof(*p)相当于sizeof(int);      
      对于静态数组,sizeof可直接计算数组大小;
      例:int a[10];char b[]="hello";
              sizeof(a)等于4*10=40;  //存的是占用的字节数
              sizeof(b)等于6;

      strlen("hello")等于5!!

在 C/C++ 中,`sizeof` 是一个用于获取数据类型或变量所占用内存大小的操作符。它返回的是以字节(byte)为单位的大小。`sizeof` 的作用主要包括以下几点: 1. **获取基本数据类型的大小**:`sizeof` 可以用于确定基本数据类型(如 `int`、`float`、`char` 等)在特定系统和编译器下的内存占用情况。例如,在 64 位系统下,`sizeof(int)` 通常为 4,表示 `int` 类型占用 4 个字节的内存空间[^1]。 2. **获取变量或数组的大小**:`sizeof` 可以直接作用于变量或数组,返回其占用的总内存大小。例如,对于一个 `int` 类型的变量或数组,`sizeof` 返回的值将根据变量或数组的类型和长度进行计算。如果有一个包含 10 个 `int` 元素的数组,其大小为 `10 * sizeof(int)`[^3]。 3. **计算结构体或联合体的大小**:`sizeof` 可以用于结构体(`struct`)和联合体(`union`),返回其整体的内存占用大小。需要注意的是,由于内存对齐的原因,结构体的大小可能不等于其成员大小的简单相加,而会包含一定的填充字节(padding)以满足对齐要求。 4. **动态内存分配的辅助工具**:`sizeof` 常用于动态内存分配时计算所需分配的内存大小。例如,在使用 `malloc` 或 `calloc` 函数分配内存时,`sizeof` 可以确保分配的内存大小与数据类型的大小相匹配。示例代码如下: ```c int* arr = (int*)malloc(10 * sizeof(int)); ``` 5. **跨平台开发中的兼容性检查**:由于 `sizeof` 的结果依赖于操作系统和编译器,它可以用于检查不同平台下数据类型的大小,以确保代码在不同环境中的兼容性。例如,`sizeof(long)` 在某些系统下可能为 4,而在其他系统下可能为 8,因此使用 `sizeof` 可以帮助开发者了解目标平台的特性[^3]。 6. **与指针相关的大小计算**:当 `sizeof` 应用于指针时,其结果表示指针本身占用的内存大小,而不是指针所指向的数据的大小。例如,在 64 位系统中,指针的大小通常为 8 字节,无论它指向的是 `int`、`char` 还是其他类型[^3]。 ### 示例代码 ```c #include <stdio.h> int main() { int a; int arr[10]; struct Example { char c; int i; } ex; printf("Size of int: %zu\n", sizeof(int)); // 输出 int 的大小 printf("Size of variable a: %zu\n", sizeof(a)); // 输出变量 a 的大小 printf("Size of array arr: %zu\n", sizeof(arr)); // 输出数组 arr 的大小 printf("Size of struct ex: %zu\n", sizeof(ex)); // 输出结构体 ex 的大小 printf("Size of pointer: %zu\n", sizeof(&a)); // 输出指针的大小 return 0; } ``` ### 注意事项 - `sizeof` 的结果类型为 `size_t`,这是一个无符号整数类型,通常用于表示内存大小- 对于数组,`sizeof` 返回的是整个数组的大小,而不仅仅是单个元素的大小- 对于结构体,`sizeof` 返回的大小可能会因为内存对齐而大于其成员变量大小的总和。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值