字符串与指针

来源:互联网 发布:unity a星算法详解 编辑:程序博客网 时间:2024/04/30 00:40


 

  1.字符串与字符串指针
  字符串是存放在字符数组中的,对字符数组中的字符逐个处理时,前面介绍的指针与数组之间的关系完全适用于字符数组。通常将字符串作为一个整体来使用,用指针来处理字符串更加方便。当用指向字符串的指针来处理字符串时,并不关心存放字符串的数组大小,而只关心是否已处理到字符串的结束符。


  【例7.10】用指针实现字符串拷贝。


   执行后输出:
  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'为止,如图7.8所示。全部拷贝过程用一个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; //正确
  小结 字符数组s[100] 指针变量pc
  (1)分配内存 分配100个单元 分配4个单元。
  (2)赋值含义 字符串放到数组存储空间 先将字符串存放到内存
  将存放串的首地址送到pc中。
  (3)赋值方式 只能逐个元素赋值 串地址可赋给pc
  (4)输入方式: 串直接输入字符数组 不能将字符串直接输入指针变量
  (5)值的改变: 字符数组首地址不能改变 指针变量的值可以改变
由以上区别可以看出,在某些情况下,用指针变量处理字符串,要比用数组处理字符串方便。