sizeof和strlen的区别

表面上看它们都可以求字符串的长度,但二者却存在着许多不同之处及本质区别。

strlen

size_t strlen ( const char * str );

  • strlen是函数
  • 字符串用 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(**不包含 ‘\0’ **)。
  • 参数指向的字符串必须要以 ‘\0’ 结束,负责会一直往后寻找,直到碰见’\0’才会停下,此种后果会返回一个随机值。
  • 注意函数的返回值为size_t,是无符号的( 易错 )。
  • strlen只能用char*做参数,且必须是以’’\0’'结尾的。
  • 数组传递给strlen就退化为指针了。

因为strlen返回值为无符号类型,优先级高于有符号类型,和有符号类型进行运算时会进行类型转换,所以strlen只能比较,不能参与运算,否则会造成不可预知的后果。

错误示例一:
   if (strlen(x) - strlen(y) >= 0)  //最终结果会转换为无符号类型,条件永为真。
   {

   }
   
错误示例二: 
   if (strlen(x) - 7) >= 0)  //最终结果会转换为无符号类型,条件永为真。
   {

   }
   
正确示例一:
  if(strlen(x)>= strlen(y))
  {
  
  }
正确示例二:
  if(strlen(x)>= 7)
  {
  
  }

sizeof

sizeof (类型说明符)   类型必须加括号,如果是变量名可以不加括号
sizeof 表达式

  • sizeof 是关键字/单目运算符,是计算变量或者类型所占内存大小的关键字(返回以字节为单位的大小),而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等。
  • 返回字符数组大小的时候,包括’\0’
  • 编译时有效,由于sizeof是在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。
  • 数组做sizeof的参数不退化。

多说无益,做几道小题练练手,加深理解:

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

PS:想对答案的话,粘贴到编译器里面运行一下(每天做一遍,防止抑郁)。

越努力,越幸福!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值