【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类对象