字符串和字符数组的区别以及sizeof和strlen的区别
来源:互联网 发布:性价比 实木家具 知乎 编辑:程序博客网 时间:2024/04/30 12:56
字符串和字符数组的区别
字符数组顾名思义就是存放字符类型的数组呗,
char str[5] ;printf("元素%d\n",sizeof(str));//5 printf("元素%d\n", strlen(str));//19 for(int i = 0; i < 5;i++){str[i] = 'A'+i;}for(int i = 0; i < 5;i++){printf("字符串中的元素%c\n", str[i]);}printf("元素%d\n",sizeof(str));//5 printf("元素%d\n", strlen(str));//19
一、利用字符数组存储字符串如下:
char str[] = "this is my ha" ;//初始化时,数组str中同时存储了\0 可以逐个改变数组中的元素int i = 0;while(str[i] != '\0')printf("字符串中的元素%c\n", str[i++]);printf("元素%d\n",sizeof(str));//14 这里其实还存储了\0printf("元素%d\n", strlen(str));//13同样初始化的时候,我们可以首先设定数组的大小,但是数组的大小必须大于等于字符串的长度 + 1
char str[5] = "this" ;//这种情况下,可以逐个改变数组中的元素
printf("元素%d\n",sizeof(str));//5
printf("元素%d\n", strlen(str));//4
printf("元素%d\n",sizeof(str));//5
printf("元素%d\n", strlen(str));//4
二、利用字符指针变量存储字符串如下:
char *str = "this is my wife" ;//字符串常量printf("元素%d\n",sizeof(str));//4 printf("元素%d\n", strlen(str));//15int i = 0;while(str[i] != '\0')printf("字符串中的元素%c\n", str[i++]);printf("字符串中的元素%c\n", str[i]);str[6] = 'o';//error 此时为字符串常量,不能改变其中的元素值i = 0;while(str[i] != '\0')printf("字符串中的元素%c\n", str[i++]);
分析下面一段程序
void _strtolower(char *str) //转小写{ int i=0; while(str[i]!='\0') { if(str[i]>='A' && str[i]<='Z') str[i]+=32; i++; } str[i]='\0';} int main(){char str[] = "ABC";char* str1 = "ABC";_strtolower(str1);//此时用str1作为实参有误,只能用str作为实参 ,str1指针变量指向的是常量字符串,其中的元素值不能改变,下面通过大小写改变了其值。这样会报错int i = 0;while(str[i] != '\0')printf("字符串中的元素%c\n", str1[i++]); return 0;}
总结:数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。利用指针变量存储的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现错误。 数组也可以用字符串常量进行初始化: Char a[]=”abcdefg”;和指针相反,由字符串常量初始化的数组是可以修改的,其中的单个字符在以后可以改变。
上面用到了sizeof和strlen,下面分析这两个的区别:
一、sizeof
sizeof是运算符,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
二、strlen
strlen()是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
sizeof是运算符,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
二、strlen
strlen()是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
0 0
- 字符串和字符数组的区别以及sizeof和strlen的区别
- 字符串中sizeof 和 strlen 的区别
- 字符串,字符指针和字符数组的sizeof和strlen
- sizeof和strlen的区别,数组和指针的区别
- strlen和sizeof的区别
- strlen和sizeof的区别
- strlen和sizeof的区别
- sizeof 和 strlen 的区别
- sizeof 和 strlen的区别
- sizeof和strlen的区别
- sizeof 和 strlen 的区别
- sizeof 和strlen的区别
- strlen和sizeof的区别
- sizeof和strlen的区别
- strlen和sizeof的区别
- sizeof和strlen的区别
- strlen和sizeof的区别
- strlen和sizeof的区别
- hdu4965Fast Matrix Calculation 矩阵快速幂
- 对新买树莓派的硬件检查
- VS2012编译出来的程序,在XP上不能运行的原因
- linux 命令 wget
- 第一天开始写博客
- 字符串和字符数组的区别以及sizeof和strlen的区别
- OC实战: 抽象类的实现
- win8命令提示符怎么以管理员方式打开
- 关于 Android Studio 鼠标中键的一些技巧
- JSP中特殊字符处理
- vc如何在GUI界面下显示命令窗
- webp格式图片
- Linux Makefile学习(二)
- Back Track下建立“钓鱼”热点测试