您的位置:首页 > 编程语言 > C语言/C++

C语言strlen函数和sizeof操作符

2015-08-24 14:31 615 查看

字符'x'于字符串"x"的区别

  'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x')

  "x"属于派生类型(char数组)字符串类型-----------由2个字符组成('x'和空字符'\0')

  


strlen函数与sizeof操作符

  

  strlen函数原型为 extern int strlen(char *s) ,用来计算字符串s的长度(不包括'\0'),使用时需要引入头文件 #include <string.h>

  sizeof是C语言的一种单目操作符,同其他操作符++、--等类似,它并不是函数。其作用就是返回一个对象或者类型所占的内存字节数

  sizeof的示例程序:

#include <stdio.h>

int main(void)
{
char* str1="absde";        //指向字符串的指针
char str2[]="absde";
char str3[8]={'a',};
printf("sizeof(str1) = %d\n",sizeof(str1));
printf("sizeof(str2) = %d\n",sizeof(str2));
printf("sizeof(str3) = %d\n",sizeof(str3));

return 0;
}


  

  运行结果:

  


  

  【分析】

  str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。在C/C++中一个指针占4个字节,所以sizeof(str1)=4

  str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的内存空间。"absde"中,共有'a','b','s','d','e','\0'六个字符,所以sizeof(str2)=6*sizeof(char)=6

  str3已经定义成了长度是8的字符数组,分配了8个字节的内存空间,所以sizeof(str3)=8

  总之,对于指针,sizeof操作符返回这个指针占的内存空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而char* str1="absde"的写法现在也不被提倡,应予以避免。

  关于二者的区别可见以下程序

#include <stdio.h>
#include <string.h>        //strlen函数的头文件
#define PRAISE "What a super marvelous name!"    //测试字符串
int main(void)
{
char name[40] = "Wsying";    //测试字符串
printf("strlen = %d        sizeof = %d\n",strlen(name), sizeof(name));
printf("strlen = %d        sizeof = %d\n",strlen(PRAISE), sizeof(PRAISE));

return 0;
}


  运行结果:

  


  【分析】

  对于name这个字符数组(字符串),strlen的返回值6恰好为"wsying"的长度(‘\0’之前停止计数);因为我们声明了name数组包含了40个单位的char型,1个char型在内存中占据1个字节,所以sizeof的运算结果为name在内存中占据的字节数为40;

  对于PRAISE(即"What a super marvelous name!")这个字符串,sizeof运算结果比strlen的结果大1,字符串占据的字节数(char类型仅占1个字节)比他的长度大1,这是因为sizeof把结束字符'\0'也算进去了('\0'也要占据内存空间),我们并没有像name那样定义为这个字符串分配多大内存,计算机自己计算它占据的字节数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: