首页 理论教育C语言程序设计基础(第3版):字符串指针表示

C语言程序设计基础(第3版):字符串指针表示

【摘要】:";无论使用哪种形式,在此后的程序代码中,都可以使用字符指针变量sPtr表示字符串数据"I Love China!使用字符指针变量表示字符串数据时,最容易出现的错误就是将未确定指向的字符串指针变量直接使用。使用指向字符数组的指针变量处理字符串示例。

C语言通过定义字符指针变量,并将字符串或字符串常量的首地址赋给该指针,即可用指向字符串的指针变量来表示其所指向的字符串数据,其定义格式有两种:

·用字符串数据初始化指针变量,其一般格式为:

char*字符指针变量名=字符串常量;

例如:char*sPtr="I Love China!";

·先定义字符指针变量,然后指向特定字符串常量,其一般形式为:

char*sPtr;

sPtr="I Love China!";

无论使用哪种形式,在此后的程序代码中,都可以使用字符指针变量sPtr表示字符串数据"I Love China!"。

当定义一个字符指针变量表示字符串时,如语句char*sPtr="abcd";,其本质上的意义是首先在存储器中存放一个字符串常量,然后将字符串常量的首地址赋给字符指针变量sPtr,字符指针变量与其所指向的字符串常量之间的关系如图8.12所示。由于sPtr是变量,所以在此后的程序代码中任何修改其指向的操作都是合法的,例如,使用语句sPtr="1234"使得指针变量sPtr改变指向从表示字符串数据"abcd"转变成为表示字符串数据"1234",sPtr与其所指向的字符串常量之间的关系如图8.13所示。

图8.12 指针变量指向字符串常量

图8.13 指针变量改变原指向指向另一字符串

而使用字符数组表示字符串时,例如,语句char str[7]="abcd";,其本质意义是首先为字符数组str按指定长度分配连续的存储空间,字符数组的名字str表示这段连续存储空间的首地址,然后将其存储内容初始化为字符串数据"abcd",字符数组str与其初始值之间的关系如图8.14所示。

图8.14 数组名与其初始化值之间的对应关系

由于字符数组名str是地址常量,数组亦不能作为整体操作,所以在此后的程序代码中任何试图修改数组名str值的操作或者试图为数组整体赋值的操作都是错误的。请仔细比较下面的两段代码段:

此外,在选择使用字符指针方式还是选择字符数组来表示字符串数据时还应注意:使用字符数组方式时,字符串数据是字符数组中存放的内容(可以认为是数组变量的值),只要有需要均可以通过合法的语句对数组中的内容进行修改;而使用字符指针变量来表示字符串数据时,字符串数据是常量,任何试图修改常量数据的操作都是非法的,亦即字符指针指向的常量字符串内容是不能被修改的。

使用字符指针变量表示字符串数据时,最容易出现的错误就是将未确定指向的字符串指针变量直接使用。未确定指向的意思是:指针变量既没有指向特定的字符数组,也没有指向动态分配的空间。例如,下面的代码段是错误的:(www.chuimin.cn)

char*st;

gets(st);   //错误:st是一个没有确定指向的字符指针变量

如果定义了字符数组,一个指向它的指针变量相当于是字符数组的另外一个名字。此时,无论是字符数组本身还是指向它的指针变量都可以用于处理字符串。如果仅定义了一个字符指针变量,那么必须使用该指针变量构成动态字符数组后才能用于处理字符串。

【例8.19】 使用指向字符数组的指针变量处理字符串示例。

上面程序中,指针变量s2在进行存储分配后形成了动态字符数组,使用动态字符数组表示了被处理的字符串。程序一次执行的结果如下:

请输入字符串s1和s2

ABCDEFG      //输入数据

1234567//输入数据

1234567ABCDEFG//输出数据