sizeof

sizeof 和 strlen 的区别如下:

1. sizeof 操作符的结果类型是 size_t,它在头文件中的 typedef 为 unsigned int 类型。该类型保证能容纳实现所建立的最大对象的字节大小。

2. sizeof 是运算符,strlen 是函数。

3. sizeof 可以用类型作参数,strlen 只能用 char* 作为参数,且必须是以 '\0' 结尾的。sizeof 还可以用函数做参数,比如:

    short f();

    printf("%d\n", sizeof(f()));

    输出的结果是 sizeof(short),即2.

4. 大部分编译程序在编译的时候就把 sizeof 计算过了,是类型或是变量的长度。这就是 sizeof(x) 可以用来定义数组维数的原因。

5. strlen 的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。

6. sizeof 后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof 是个操作符而不是个函数。

7. 当使用了一个结构类型或变量时,sizeof 返回实际的大小。当使用一静态的空间数组时,sizeof 返回全部数组的尺寸。sizeof 操作符不能返回被动态分配的数组或外部的数组的尺寸。

8. 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。在 C++ 里传递数组永远都是传递指向数组首地址的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要将数组大小作为参数传入。

9. sizeof 操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。


sizeof 的使用场合

1. sizeof 操作符的一个主要用途是与存储分配和 I/O 系统那样的例程进行通信。例如:

    void *malloc(size_t size);

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

2. 用它可以看看某种类型的对象在内存中所占的单元字节。例如:

    void *memset(void *s, int c, sizeof(s));

3. 在动态分配一对象时,可以让系统知道要分配多少内存。


sizeof 不是函数,也不是一元运算符,它是个类似宏定义的特殊关键字,sizeof()。括号内的内容在编译过程中是不被编译的,而是被替代为类型,如 int = 8; sizeof(a);。在编译过程中,不管 a 的值是什么,只是被替换成类型 sizeof(int),结果为 4。如果 sizeof(a=6); 呢?也是一样地转换成 a 的类型。但是要注意,因为 a=6 是不被编译的,所以执行完sizeof(a=6); 后,a 的值还是8,是不变的。

结论:

1. unsigned 影响的只是最高位 bit 的意义(正/负),数据长度是不会被改变的。

2. 自定义类型的 sizeof 取值等同于它的类型原型。

3. 对函数使用 sizeof,在编译阶段会被函数返回值的类型取代。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值