首页 > 编程知识 正文

c语言字符指针定义字符串,c语言指针指向字符串

时间:2023-05-05 20:41:34 阅读:177277 作者:804

字符串和字符串数组字符串必须是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语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量(用指针表示),它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。