字符串,字符指针和字符数组的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。
字符是构成源程序的基本要素。每个程序都是由一系列组合在一起有意义的字符构成的。字符常量是以单引号括起来的字符表示的整数值,即该字符在计算机字符集中的整数值。字符指针,是指向字符的指针。字符串是作为一个整体对待的一系列字符串,可以包含字母,数字和各种专门的字符;注意字符串常量是用双引号标识的。字符数组,即存储字符的数组,也就是数组的存储类型为字符。
在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。
相关文章推荐
- C++11 基础之字符数组,字符串,字符指针通过sizeof、strlen求值
- C中 字符数组和字符串以及strlen 和sizeof
- 计算字符串的长度及sizeof与strlen、gets与scanf、字符数组与字符串
- strlen /sizeof/ 0,'\0','0'中的陷阱+补充字符串字符数与数组大小相等
- 字符数组,字符指针,sizeof,strlen总结
- 字符数组、字符指针;sizeof、strlen
- C、C++字符数组,字符指针,sizeof,strlen总结
- 字符数组和指针的sizeof(),strlen()以及getline()
- C++中strlen与sizeof处理字符数组和字符指针
- sizeof 和 strlen 在求解数组 字符数组 字符串 二维数组时候的小结
- 字符数组,字符指针,sizeof,strlen总结
- 字符数组,字符指针,sizeof,strlen总结
- sizeof与strlen使用,字符串指针数组
- 补补基础知识,关于字符串,字符数组,CString型字符串,strlen,sizeof
- 字符数组,字符指针,sizeof,strlen总结
- 指针的相关运算,包括一维数组、二维数组、字符数组的sizeof、strlen运算
- C++字符数组、字符指针、strlen、sizeof总结
- 字符数组,字符指针,sizeof,strlen总结
- 字符数组 字符指针 sizeof strlen 的区别
- 一维数组,字符数组,字符串,二维数组在sizeof()和strlen()下的不同输出