2011-08-24 12:49
-
Linux C -
584 个人浏览
字符串不是C的基础类型,基础类型只有整型,浮点型和指针,那么为什么没有字符型,因为字符型实际就是整型互相转义得到的。 实际上C中有字符串常量这个概念,定义一个字符串“abcde“就是一个字符串常量,但是某个情况下却表示一个字符数组,具体看初始化的场景。 比如 char a[] =”xxx”; 初始化,a是字符数组,本身是一个地址,但是又不能完全当作指针来用,因为它确实不完全等于指针,它的类型是一个长度为4的字符数组,包括最后的\0字符,用以表示字符数组的结束,可以理解a为一个分配的内存块,而且本身是常量,你可以使用一个指针指向这个内存块的开始位置,因为内存地址对其,所以可以用指针或者数组名顺序访问它的单元,而a++这种想要改变常量的表达式就是错误的了。 对于一个这样的字符数组,初始化也十分重要,在一个函数域中,你不将其初始化,会导致默认的单元是随机的。 像字符数组初始化也有很多情况: 1、能不能先定义char a[];然后赋值,不管是a=”xxx”;还是a={‘x’,’x’,’x’,‘\0′}都是错误的,初始化只能发生在定义的时候。 2、能不能先定义char a[4],然后赋值,对于a=”xxx”和a={‘x’,’x’,’x’,’\0′}也是错误的,只能发生在定义的时候,但是和上面相比,这个字符数组定义了实际的大小,从而可以通过数组名来填充数据初始化。 而对于char a[] = {‘x’,’x’,’x’};与char a[] = “xxx”的区别在于最后的’\0′字符存不存在问题了。 对于 char *a = “xxx”;这种,开始一直以为存在在堆里面,查阅资料发现存在数据段中,也就是静态存储区,而这和堆的最大区别是一旦这个做,表明这个字符串是常量的,也就是你无法通过指针偏移来改变内容,而对于char *a =(char *)malloc(sizeof(char)*4);则是可以的,分配在堆中,如果在一个栈中(函数域),想通过指针访问一个变量,就应该要么字符串常量(全局存在的和全局变量,静态变量一样了),要么就malloc吧,但是要记得用完free掉。 最后这个 char *a = {‘x’,’x’,’x’}; 会告诉你类型不匹配,一个指针型,却使用字符数组型初始化。 其他: 字符串在网络编程中很多使用,常用的函数一般为str开始的比如strlen,strcpy,strcasecmp,strcmp这些,其特点就是不会计算或者以’\0′为准,比如strlen不会把’\0′算在长度内,这里不得不说sizeof和这个在计算字符串(数组)的时候区别了,如果是字符指针初始化,strlen可以得到结果,但是不包含\0的长度,sizeof则直接计算char的类型长度为4,如果是字符数组型初始化,则strlen可以得到正确结果,具体看何种方式,“”和{},而sizeof则会得到包含\0的长度计算在内,看见char a[] = “xxx”;sizeof也是可以计算的。 另外一类函数是mem开始的,memcpy,memmove,memcmp这类,这个就是直接将要的内容在内存中复制,移动,要不要包含\0在于你的设定了,因为一般都有个size的限定。 最后涉及字符串的还有 const char * 和char *const 还有const char *const这中定义,而且很常见。
已有 0 条评论 »