字符串和字符数组的区别以及sizeof和strlen的区别

字符串和字符数组的区别
字符数组顾名思义就是存放字符类型的数组呗,
 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 这里其实还存储了\0
	printf("元素%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));//15
	int 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。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值