【C++】指针与字符串的基础知识

一. 指针

使用指针访问数据*pValue需二次访存,第一次访存,得到存放该数据的地址pValue,第二次访存,得到该内存地址存放的数据*pValue

1.指针的声明和赋值

   声明  dataType *pValue;

   以整形为例

     int count=5;

          int *pValue=&count;

     或  int *pValue;

          int count=5;

          pValue=&count;

   pValue的值是count的内存地址, *pValue=5

2.数组与指针

          dataType Array[n]; //数组变量Array表示的是该数组的起始地址

          dataType *pArray=Array; //指针数组pArray,pArray指向Array的起始数据

等价于  dataType*pArray=&Array[0];

   以下四项的值相同:

          Array[i];  *(Array+i);

          pArray[i];  *(pArray+i)

归纳:一个数组本质上是一个指针,数组可以当做指针使用,指针也可以当做数组使用

        但,数组一旦声明,不可改变数组的地址,但指针可以

3.常量指针

以整形为例

1)指针常量

       int count=5;

     int * const pValue=&count; //pValue是指针常量,其值是不变的,但pValue指向的数据可以改变

2)指向常量的指针

     const int *pValue=&count; //地址(pValue)可以改变,但地址指向的数据(*pValue)不变

3)指向常量的指针常量

     const int *const pValue=&count; //地址不变(pValue),地址指向的数据(*pValue)也不变

4.动态分配内存空间

1)单个变量

          dataType *pValue=dataType new; //为一个int变量分配内存空间,并将变量地址赋给pValue

2)数组变量

     dataType *pArray=dataType new[n]; 

注意:C++中局部变量在栈中分配内存空间,而由new操作符分配的空间在中,分配的空间一直可用,直至用delete释放或程序终止时

显式地释放内存空间

      delete pValue;

    delete[] pArray;

 使用指针时,要防止内存泄露。内存泄露即,一个内存空间没有指针指向,不能访问也不能释放

 

二. 字符串

      C++中字符串处理有两种方式,1)字符数组  2)string类

      string类是C++较之于C独有的字符串处理机制,而字符数组机制与C一致

(一)、字符数组

1.字符串的存储和访问

          char Array[n]; //字符数组以空结束符'\0'结尾,空结束符也包含在数组大小内

          char* pArray; //指针型字符数组

  以下四项均表示字符串Array的第i+1个字符:

         Array[i];  *(Array+i);

         pArray[i];  *(pArray+i)

字符串输出:

        cout<<Array; 等价于 cout<<pArray;

注意   cout<<*pArray;输出的是pArray指向的字符串的第一个字符

2.读取字符串

   若要读取含空格的字符串,直接用cin是办不到的,因为C++默认字符串是以空白符结束的。这时要用cin的getline函数

  语法如下

       cin.getline(char array[], int size, char limitChar);

   该函数会在遇到分隔符limitChar之前,或与读入size-1个字符时,停止读取字符,并将这段字符串保存在数组array中。如果函数遇到limitChar,会读入它,但不会保存在数组中

   limitChar的默认值为'\n',故函数可以简化为:

      cin.getline(char array[],int size);

3.字符串函数

  在头文件#include<cstring>中,包含很多字符串检测和处理函数

1)字符串长度

       int strlen(char *s);   //返回空结束符之前的字符数目

2)字符串复制

       char *strcpy(char *s1, const char *s2);  //将字符串s2复制给s1,返回s1中的地址值

       char *strncpy(char *s1,const char *s2, size_t n);  //将s2最多n个字符复制给s1,返回s1地址值

3)字符串追加

       char *strcat(char *s1,const char *s2);  //将s2追加在s1之后,覆盖空结束符,返回s1地址值

       char *strncat(char *s1,const char *s2, size_t n);  //将s2最多n个字符追加在s1之后,返回s1地址值

4)字符串比较

       int *strcmp(char *s1,const char *s2);  //s1>s2,返回正数   等于,返回0   小于,返回负数

       int *strncmp(char *s1,const char *s2, size_t n);  //将s1前n个字符和s2的前n个字符比较

(二)string类

   string类包含在头文件#include<string>中

    使用该机制,字符串均为string类的一个对象,可以使用下列成员函数

1.字符串构造

string类有多种构造函数

       string();  //构造一个空字符串

       string(string s); //字符串常量s构造一个字符串

       string(char s[]); //由字符串数组构造一个字符串

       string(char ch, int n); //初值为n个ch字符

2.字符串追加

       append(string s):string  //将字符串s追加在当前string对象后

       append(string s, int index, int n):string  //将s中从index起始的n个字符追加在当前string对象后

       append(char s[], int n):string  //将字符数组s的前n个字符追加在当前string对象后

       append(int n, char ch):string  //将n个ch字符追加在当前string对象后

3.字符串赋值

       assign(char s[]):string  //将字符数组s赋给当前字符串

       assign(string s, int index, int n):string  //将s中从index起的n个字符赋给当前字符串

       assign(string s, int n):string  //将s的前n个字符赋给当前字符串

       assign(int n, char ch):string  //将n个ch字符赋给当前字符串

4.字符串长度及删除

       at(int index):char  //返回字符串index处的字符

       length():int  与  size():int    //返回字符串的长度

       clear():void     //清除字符串中所有字符

       erase(int index, int n):string   //删除字符串从index起的n个字符

       empty():bool     //若字符串为空,返回true     

5.字符串比较

       compare(string s):int   

       compare(int index, int n, string s):int   //与字符数组比较函数类似

       copy(char s[], int n, int index):void    //将当前字符串从index起的n个字符赋给字符数组s

6. 获得子串

       substr(int index):string    //返回当前字符串从index开始的子串

       substr(int index, int n):string   //返回当前字符串从index开始的n个字符的子串

       data():char*       //将字符串以一个字符数组返回

7.字符串搜索

       find(char ch):int    //返回字符串中字符ch出现的第一个位置

       find(char ch, int index):int    //返回字符串从index开始字符ch出现的第一个位置

       find(string s):int      //返回字符串中子串s出现的第一个位置

       find(string s, int index):int    //返回字符串中从index开始子串s出现的第一个位置

8.字符串插入和替换

       swap(string s):void     //交换当前字符串和s的内容

       replace(int index, int n,string s):string    //将当前字符串内容从index开始的n个字符替换为s

       insert(int index, string s):string     //将s插入到当前字符串index处

       insert(int index, int n, char ch):string     //将n个ch字符插入到当前字符串index处

9.字符串运算符

       C++中的字符串运算符,可简化一些操作

       []          数组下标运算符,访问字符串中的字符(相当于at函数)

       =          将字符串内容复制给另一字符串

       +          连接两个字符串得到一个新串

       +=        将一个字符串追加到另一字符串末尾

       <<        输出流

       >>        从一个流中提取字符串,分界符为空格或结束符

       ==, !=, <, <=, >, >=         字符串比较

 注意:以上双目运算符中,左右操作数均为string类对象

 

      

 

 

 

 

 

                                                                                                                                

 

 

 

 

                                                                                                                                

posted @ 2013-04-09 17:28  MinZhang  阅读(658)  评论(0编辑  收藏  举报