字符串和字符数组的区别以及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
 
//这里的19实际上每次运行可能不一样,这取决于str里面存了什么(从str[0]开始直到遇到第一个NULL结束)
用字符数组和字符指针变量都可实现字符串的存储和运算。
一、利用字符数组存储字符串如下:
        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

二、利用字符指针变量存储字符串如下:
        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。





0 0
原创粉丝点击