用字符数组和字符指针变量都可实现字符串的存储和运算,但是两者是有区别的。在使用时应注意以下几个问题:
(1)字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以′\0′作为串的结束。字符数组是由若干个数组元素组成的,每个元素中存放一个字符,绝不是将字符串放到字符指针变量中。
(2)对字符数组作初始化赋值,可以在定义时整体赋初值,但不能在赋值语句中整体赋值,在语句中只能对字符数组的各元素逐个赋值。如“char st[]={"C Language"};”,而不能用以下办法对字符数组赋值:
static char st[]={"C Language"};
不能写为:
char st[20];st={"C Language"};
而对字符指针变量则无此限制,可以采用下面方法赋值:
char*ps;
ps="C Language";
注意,赋给ps的不是字符,而是字符串第一个元素的地址。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。因此,下面的语句都是合法的。
char*ps="C Langage";
或者
char*ps;
ps="C Language";
(3)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,也就是说,该指针变量可以指向一个字符型数据,但如果不对它赋予一个地址值,则它并不具体指向一个确定的字符数据。
例如:
char str[10];
scanf("%s",str);(www.xing528.com)
是可以的。而常有人用下面的方法:
char*a;
scanf("%s",a);
目的是想输入一个字符串,编译时发出“警告”信息,提醒未给指针变量指定初始值。因为编译时虽然给指针变量a分配了内存单元,变量a的地址(即&a)是已指定了,但a的值并未指定,在a单元中是一个不可预料的值。在执行scanf函数时要求将一个字符串输入到a所指向的一段内存单元[即以a的值(地址)开始的一段内存单元]中,而a的值如今却是不可预料的,它可能指向内存中空白的用户存储区,也有可能指向已存放指令或数据额有用内存段,这就会破坏程序,甚至破坏系统,会造成严重的后果。应该写成这样:
char*a,str[10];
a=str;
scanf("%s",a);
先使a有确定值,也就是使a指向一个数组的首元素,然后输入一个字符串,把它存放在该地址开始的若干单元中。
(4)前面已说明,若指针变量p指向数组a,则可以用指针变量带下标的形式引用数组元素,同理,若字符指针变量p指向字符串,就可以用指针变量带下标的形式引用所指的字符串中的字符,例如:
char*a="I love China!";
则a[5]的值所指向的字符串“I love China!”中第6个字符(序号为5),即字母“e”。
虽然并未定义数组a,但字符串在内存中以字符数组形式存放的。a[5]按*(a+5)处理,即从a当前所指向的元素下移5个元素位置,取出其单元中的值。
(5)字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值)。
例如:
char a[]="House";
char*b="House";
a[2]=′r′; //合法,r取代u
b[2]=′r′; //非法,字符串常量不能改变
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。