字符串和字符串数组字符串必须是char数组,但char数组并不一定是字符串。 char数组以字符“ 0”结尾,但如果char数组不是以“ 0”结尾,则为普通字符数组,而不是字符串,因此为字符串是一种特殊的char数组
两者的区别:
字符串:
1、将字符串初始值用双引号括起来;
2、以隐含的空字符 结束,占用字节数+1,注意:1字节/字母,2字节/汉字;
3、字符串可以用%s格式化输出。
普通字符数组:
1、普通字符数组初始值由大括号引起;
2、不包含空字符,占用字节数不需+1;
3、普通字符数组以%s格式输出,输出结果为乱码。 ’ 0’因为没有结束符。
例如:
# include stdio.h # include string.hint main (void )/*字符数组中的初始值*/charcarr )={'I '、' l '、' o '、' v、' e } sizeof (中的长度) /打印(' carr的长度=%dn ',sizeof ) carr ); printf(sarr长度=%d(n ),sizeof ) sarr ); 用printf的%s打印内容*/printf('cArr内容=%sn ',carr ); printf(sArr内容=%s(n ),Sarr ); 返回0; }执行结果如下
如果定义:
char cArr[]={'I ',' l ',' o ',' v ',' e ',' c ',' '}; char sArr[]='ILOVEC '; cArr和sArr完全相同,都表示相同的字符串。
另外,%s格式化输出从当前地址到结束标志’ ’之前的所有字符
# include stdio.h # include string.hint main ({ char str [ ]=' http://c.biancheng.net '; printf(%s(n ),str ); //直接输出字符串printf('%sn”,str 1);//从第二个地址到最后的值输出printf(%s(n )、str 2);//从第三个地址输出到最后的值return 0; }
通过分析上述代码,现在可以很容易地总结出字符数组和字符串的区别。
对于字符数组,长度是固定的,数组元素可以是空字符。 因此,字符数组不一定是字符串。
对于字符串,必须以null结尾,且后续字符不属于该字符串。 字符串必须是字符数组,最后一个字符是空字符的字符数组。
字符串数组和字符串指针字符串数组:
//字符串数组# include stdio.h # include string.hint main ({ char str [ ]=' http://c.biancheng.net ' ); intlen=strlen(str ),I; //直接输出字符串printf('%sn”,str ); //可以直接输出从当前地址(字符串的起始地址)到结束标志)0)的所有字符) /一个字符一个字符地for ) I=0; ilen; I ) {printf('%c ',str[i]; }printf((n ); 返回0; } 字符串指针:
//字符串指针# include stdio.h # include string.hint main () { char * str=' http://c.biancheng.net '; intlen=strlen(str ),I; //直接输出字符串printf('%sn”,str ); //当前地址(可以直接输出从字符串的起始地址)到结束标志(0)的所有字符) ) (*(str i ) for ) I=0; ilen; I ) {printf('%c ',* ) *(str i ); }printf((n ); //str[I]for(I=0; ilen; I ) {printf('%c ',str[i]; }printf((n ); 返回0; }所有结果:
http://c.biancheng.net
这看起来都和字符数组多么相似。 您可以使用%s输出整个字符串,也可以使用*或[ ]获取各个字符。 表示这两个字符串的方法不是没有区别吗?
有!它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
内存访问权限差异的一个显著结果是,字符数组在定义后可以读取和修改每个字符,但在第二种格式的字符串中,一旦定义就只能读取、不能修改,而且赋值错误。
第二种形式的字符串称为字符串常量。 很明显,常数是只读的,不可写。 请看下面的演示:
#include stdio.hint main () {char *str='Hello World!' ; str='I love C!' ; //正确的str[3]='P '; //错误返回0; }此代码将成功编译并链接,但在运行时会出现段错误(Segment Fault )或写入位置错误。
第四行代码是正确的,可以更改指针变量本身的方向; 第五行代码错误,无法修改字符串中的字符。
到底使用字符数组还是字符串常量
如果在编程过程中只涉及字符串读取,则字符数组和字符串常量都可以满足要求。 如果有写入(修改)操作,则只能使用字符数组,不能使用字符串常量。
最后我们来总结一下,C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量(用指针表示),它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。