1.字符串与字符串指针
字符串是存放在字符数组中的,通常将字符串作为一个整体来使用,用指针来处理字符串更加方便。
当用指向字符串的指针来处理字符串时,并不关心存放字符串的数组大小,而只关心是否已处理到字符串的结束符。
用指针实现字符串拷贝
# include <iostream.h>
# include <string.h>
void main(void) {
char *p1 = "I am a student" ;
char s1[],s2[];
strcpy(s1,p1); //用命令拷贝字符串
char *p2 = s2; //将数组s2首地址赋p2
for (;*p2++=*p1++;); //用指针拷贝字符串
cout << "s1=" << s1 << endl;
cout << "s2=" << s2 << endl;
}
执行后输出:
s1= I am a student
s2= I am a student
说明:
(1)编译系统执行定义语句char *p1=”I am a student” 时,首先为字符串”I am a student “分配内存空间,然后将该内存空间首地址赋给指针变量p1。
(2)用指针变量拷贝字符串过程是,先将指针变量p2指向字符串数组s2的首地址,然后通过赋值语句*p2=*p1将字符由字符串s1中拷贝到s2中,再移动p1、p2到下一个字符单元,依次循环直到字符串结束符’\0’为止。
全部拷贝过程用一个for语句完成。
在for(;*p2++=*p1++;)语句中,表达式:*p2++=*p1++ 等价于下列三条语句:
*p1=*p2; // s2[i]=s1[i],将指针p1所指s1[i]赋给指针p1所指s2[i]。
p1++; //指针p1加1指向s1的下一个元素
p2++; //指针p2加1指向s2的下一个元素
上述语句不断循环,直到p1指向结束字符’\0’=0时,for 语句因条件为假而结束。从而完成字符串s1拷贝到字符数组s2的任务。
(3)指针变量p1可以作为拷贝函数strcpy(s1,p1)的参数。
2.字符型指针变量与字符数组的区别
(1)分配内存
设有定义字符型指针变量与字符数组的语句如下:
char *pc ,str[100];
则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符。而系统只为指针变量pc分配4个存储单元,用于存放一个内存单元的地址。
(2)初始化赋值含义
字符数组与字符指针变量的初始化赋值形式相同,但其含义不同。
例如:
char str[ ] =”I am a student ! ” ,s[200];
char *pc=”You are a student ! ” ;
对于字符数组,是将字符串放到为数组分配的存储空间去,而对于字符型指针变量,是先将字符串存放到内存,然后将存放字符串的内存起始地址送到指针变量pc中。
(3)赋值方式
字符数组只能对其元素逐个赋值,而不能将字符串赋给字符数组名。
对于字符指针变量,字符串地址可直接赋给字符指针变量。
例如:
str=”I love China! “; //字符数组名str不能直接赋值,该语句是错误的。
pc=”I love China! “; //指针变量pc可以直接赋字符串地址,语句正确。
(4)输入方式
可以将字符串直接输入字符数组,而不能将字符串直接输入指针变量。但可将指针变量所指字符串直接输出。
例如:
cin >> str //正确
cin >> pc //错误
cout << pc //正确
(5)值的改变
在程序执行期间,字符数组名表示的起始地址是不能改变的,而指针变量的值是可以改变的。
例如:
str=str+5; //错误
pc=str+5; //正确