纠结的sizeof()与strlen()

看过百度文库关于sizeof和strlen的内容后,将其整理如下:

 

sizeof()与strlen()的比较:

1.定义:sizeof是一个操作符(编译时就计算出了长度),作用就是返回一个对象或者类型所占的内存字节数

             strlen是一个函数(运行时通过函数调用计算长度),计算字符串的长度直到碰到第一个字符串结束符'/0'。

              

2.用法

sizeof有三种语法形式,如下:

  1) sizeof( object ); // sizeof( 对象 );    

  2) sizeof( type_name ); // sizeof( 类型 );     例如:sizeof(int)为整型所占的字节数

  3) sizeof object; // sizeof 对象;

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

 

strlen()语法:

     size_t strlen( const char *string ) //strlen(字符串)

 

sizeof()和strlen()的返回值都是size_t(unsigned int)类型

 

3.数组做sizeof的参数不退化为指针,传递给strlen就退化为指针了.

   如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
即:int func(char p[100])  //数组退化为指针
{ sizeof(p) = 4; }
C/C++
中不能传数组,只能传指针,所以任何数组都会隐式转成指针形式进行操作,所以"类型"还是指针。

 

4.处理字符串时

参数为字符数组:

 

  char str[20]="012345";
  int a=strlen(str)=6; (strlen
计算字符串的长度,以结束符 0x00 为字符串结束。)
  int b=sizeof(str)=20; (
sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。)

 

  char str[]="012345";

  int a=strlen(str)=6; 不包含NULL字符

  int b=sizeof(str)=7; 包含NULL字符

 

本质的区别是:sizeof是对象或类型占用的内存大小,而strlen是字符串的长度。

              这里sizeof是数组对象的内存大小(包含null('/0'))。

 

参数为字符串指针

  char* p = "012345";
  sizeof(p)=
4 (p是指向字符串常量的字符指针,sizeof 获得的是指针p所占的空间,是长整型的:4字节)

  注意:当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2farhuge类指针字节数为4。一般Unix的指针字节数为4

  strlen(p)= 6 (如果要获得这个字符串的长度,则一定要使用 strlen。)
  sizeof(*p)=
1 (*p是第一个字符其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位)

 

5.sizeof(结构体对象)与sizeof(联合体)

  struct 

 {char b; int x;} a;

  在某些机器上sizeofa=8,而一般sizeofchar+ sizeof(int)=5
这是因为编译器在考虑对齐问题(这里假设机器是4字节对齐)时,在结构中插入空位以控制各成员对象的地址对齐。

 

  联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
 

补充: 数组什么时候会"退化"?
数组在除了以下2种情况外, 其他时候都要"退化"成指向首元素的指针.
例如:char a[] = "hello";
这2中例外情况是:
(1) sizeof(a)
(2) &a(pointer to array of 6 chars)
除了上述2种情况外,a都会退化成&a[0].

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值