您的位置:首页 > 其它

字符串,字符指针和字符数组的sizeof和strlen

2012-08-12 18:34 267 查看
1 基本定义

字符是构成源程序的基本要素。每个程序都是由一系列组合在一起有意义的字符构成的。字符常量是以单引号括起来的字符表示的整数值,即该字符在计算机字符集中的整数值。字符指针,是指向字符的指针。字符串是作为一个整体对待的一系列字符串,可以包含字母,数字和各种专门的字符;注意字符串常量是用双引号标识的。字符数组,即存储字符的数组,也就是数组的存储类型为字符。

在C语言中,字符串是用指向字符串中第一个字符的指针访问的,字符串的值是其第一个字符的地址;字符串是以空字符‘\0’结束的字符数组。字符指针、字符串和字符数组有着十分微妙的关系。

2 字符指针、字符串和字符数组的sizeof

在定义上看,字符串可以用字符指针和字符数组表示,并且访问字符串或字符串中的元素可以以移动字符指针的方式访问。但是三者的 sizeof大小却有很大差别。

以实际例子来看。char *pionter; char *str="abcdefg"; char arry[]={'a', 'b', 'c', 'd', 'e', 'f', 'g'};在32位的系统中,sizeof(pionter)=sizeof(str)=4;而sizeof(arry)=8。字符串和字符指针大小都是4,可以看出sizeof对于字符串的处理与字符指针相同,按字符指针对待。而字符数组的sizeof大小不同,是根据数组中实际元素的个数,本例子如果定义成char
arry[10]={'a', 'b', 'c', 'd', 'e', 'f', 'g'};那么sizeof(arry)=10,即数组大小已经固定。

如果pionter=str; sizeof(pionter)仍然是4;由于数组名其实就是一个const类型的指针,如果pionter=arry; sizeof(pionter)仍就为4。

3 字符指针、字符串和字符数组的strlen

如上定义,如果不给pionter赋值,直接使用strlen(pionter)是不正确的,如果有这样的定义char *p; char pp='a'; p=&pp;那么strlen(p)会等于多少呢?不是想象中的1,而是一个无法确定的值。因为这三条语句相当于把p赋值成指向pp地址的字符串,但是该字符串没有结束符,strlen是以null作为结束符的,所以其大小时不确定的。

strlen(pionter)=7即字符串中字符的个数,strlen不把字符串结束字符计算在内。strlen(arry)=7,同样arry[]中只有7个元素,结束字符’\0‘不计算在内。可以看出strlen对字符串和字符数组处理方式相同。注意如果定义char arry[10]={'a', 'b', 'c', 'd',
'e', 'f', 'g'};与sizeof不同,strlen(arry)=7,及字符数组中实际字符个数,而不是开始定义的数组所申请的内存空间。另外补充一点,如果char arry[7]={'a', 'b', 'c', 'd', 'e', 'f', 'g'};那么strlen(arry)等于一个 不确定的值。

如果赋值语句pionter=str; 那么strlen(pionter)=7;即把字符指针当字符串一样的处理。如果有pionter=arry;那么strlen(pionter)仍然为7,即strlen(arry)的大小。

4 详述字符数组的strlen与sizeof

上面文字可以知道,字符数组的strlen与sizeof不同。定义char arry[]={'a',
'b', 'c', 'd', 'e', 'f', 'g'}; sizeof(arry)=8; strlen(arry)=7;相差1,原因大家都明白,不比细说。定义char arry[7]={'a', 'b', 'c', 'd', 'e', 'f', 'g'}; sizeof(arry)=7;即定义数组时指定的空间大小;strlen(arry)是一个不确定的值,因为该字符数组没有结束符(是一个不小于7的值)。定义char
arry[10]={'a', 'b', 'c', 'd', 'e', 'f', 'g'}; sizeof(arry)=10;即定义数组时指定的空间大小;strlen(arry)=7;字符数组中实际存在的 字符个数。arry[10]后面的元素自动赋值为0。


如果定义char arry[10]={0,0,0,0,0,0,0,0,0,0}; 那么sizeof(arry)=10; strlen(arry)=0;因为字符数组的结束符’\0‘的值就是0。如果char arry[]={'a', 'b', 'c', 'd', 'e',
'f', 'g','0',0,0}; 那么sizeof(arry)=10; strlen(arry)=8; ’0‘与0不同,’\0‘是一个实实在在的字符,而0则表示该字符为’\0‘,所以结果为8。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: