天天看点

C/C++ 字符串与指针

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; //正确