字符'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那样定义为这个字符串分配多大内存,计算机自己计算它占据的字节数。