内存池之间的区别
吃蛋糕<----->允许你买一个蛋糕分着吃
内存池<----->允许你申请一段内存,重新分配
允许大家申请一段内存,共给程序使用,综合管理内存
c++内存和c语言内存的区别
c语言内存 malloc 内存是在堆区
c++内存 new 内存是自由存储区(可以自己指明从哪个位置开始申请)
基本语法
指针类型 = new ( 申请内存的开始位置 ) [ 申请内存大小 ]{ 是否初始化 };
int* pNum = new(申请内存的开始位置) int[3]{1,2,3};
下面代码中是从memorySum这个内存的首地址开始申请内存的,写代码处理事情,需要内存,所有的内存源于memorySum,对这段内存再分配
void testMemory()
{
char* memorySum=new char[1024];
//假设需要输出3个整数 带初始化的方式
int* pNum=new(memorySum) int[3]{1,2,3}; //3个int用了3*4==12字节
//假设需要输出一个字符串
char* pstr=new(memorySum+12) char[20]{"iloveyou"};//允许在已申请的内存上再做申请
for(int i=0;i<3;i++)
{
cout<<pNum[i]<<" "; //输出1 2 3
}
cout<<endl<<pstr<<endl;//输出iloveyou
delete[] memorySum; //释放
memorySum=nullptr;
}
综合管理内存的好处:
释放方便,不用管申请细节,如果每次单独申请一块内存要释放多次,如果综合管理,只用释放一次即可
小提醒:
同一个指针尽量绑定一块内存,不要用同一个指针绑定两块内存
void testMemory()
{
char* memorySum=new char[1024];
int* pNum=new(memorySum) int[3]{1,2,3}; //3个int用了3*4==12字节
char* pstr=new(memorySum+12) char[20]{"iloveyou"};
//char* pstr=new(pNum+3) char[20]{"iloveyou"}; 指针偏移的方式(和上一条代码等效)
for(int i=0;i<3;i++)
{
cout<<((int*)memorySum)[i]<<" "; //c语言指针方式 char*强转为int*
cout<<((int*)(memorySum))[i]<<" "; //c++的方式 必须(int*),否则会报错
}
cout<<(memorySum+12)<<endl; //通过指针的偏移去做打印
delete[] memorySum;//释放
memorySum=nullptr;
}
/*输出*/
1 2 3
1 2 3
iloveyou
String类型(本身是一个类)
#include<string>
注意不要写成string.h (string.h是c语言的,c++没有.h)
String的创建
-
不带初始化
-
带初始化
-
通过另一个字符串创建
#include<string>
//using namespace std; 在标准命名空间下,不加要写std::前缀
void createstring()
{
std::string str; //创建
}
创建后初始化
string str1;
str1="iloveyou"; //直接字符串初始化即可
cout<<"First:"<<str1<<endl;
创建时初始化
string str2("iloveyou"); //str2初始化为()中的内容
cout<<str2<<endl;
string str3="iloveyou"; //也可以用等号赋值的方式初始化
cout<<str3<<endl;
通过另一个字符串创建
string str3="iloveyou";
cout<<str3<<endl;
//通过str3初始化str4
string str4(str3);
cout<<str4<<endl;
//用等号赋值的方式初始化
string str5=str4;
cout<<str5<<endl;
字符串的长度无要求,内存会自动扩增
void initString()
{
char* str=new char[15]; //超过15还能存储数据,自动增大原来的内存
}
一般string不用const,加了不能修改,c++中尽量用string,不要用char*
const string str2="iloveyou"; //常对象
str2="imissyou"; //报错,常属性不能修改
string的基本操作
-
拷贝
-
赋值
-
连接
-
比较
赋值
void operatorString()
{
string str1="one";
string str2="two"; //直接用赋值语句方式赋值
string str3=str2;
cout<<str3<<endl;
}
连接
本质是函数的调用,属于运算符重载的知识,后面会提及
void operatorString()
{
string str1="one";
string str2="two"; //不需要考虑长度,直接用"+"连接即可,没有"-"
string str4=str1+str2;
cout<<str4<<endl;
}
//调用成员函数的方式
void operatorString()
{
string str1="one";
string str2="two";
string str4=str1.append(str2);
cout<<str4<<endl;
}
比较
void operatorString()
{
string str1="one";
string str2="two"; //直接比较即可,比较依旧是按照char* 的方式比较
if(str1>str2)
{
cout<<"大的"<<str1<<end1;
}else
{
cout<<"大的"<<str2<<end1;
}
}
//调用成员函数的方式 通过判断返回值0 -1 1
void operatorString()
{
string str1="one";
string str2="two";
if(str1.compare(str2)>0)
cout<<"大的"<<str1<<end1;
else if(str1.compare(str2)<0)
cout<<"大的"<<str2<<end1;
else
cout<<"相等"<<endl; //0
}
c++string和c语言string.h
c++中的自定义类型,本质是一个类
c++string不能直接用于c语言的字符串处理函数,如果要使用: c++的string要转成c语言的char*
c++提供了2个函数,用于把string转成char*
-
c_str()
-
data()
c++ string中记录长度时没有记录'\0' 不能用%s方式打印
//字符串拷贝,包含一下c语言的string
#include<cstring>
void compareCandCpp()
{
string str1="iloveyou";
printf("%s\n",str1); //没有输出 原因:%s对应char* 需要把string转成char*
//string转成char*
printf("%s\n",str1.c_str());
printf("%s\n",str1.data());
}
小知识:Easyx图形化编程打印文字
outtextxy(int x,int y,char* str); //一定要把string转char*,不转会报错
to_string: 把数字直接转成相应的字符串
string str2=to_string(1234);
cout<<str2<<endl;//输出字符串"1234"
采用下标方式打印string
void exoperator()
{
//如果未初始化,长度不存在
string str="imissyou"; //c++ string中记录长度时没有记录'\0' 不能用%s方式打印
for(int i=0;i<8;i++)
{
cout<<str[i]; /*有一个参数size,类似数据结构中的串,有一个专门的变量
用来记录长度,放一个元素记录一下长度*/
}
cout<<endl;
}
其他函数操作
-
empty() 判断是否为空
-
size() 记录长度
string mySring="imissyou";
cout<<"myString:"<<myString.size()<<endl; //输出: mystring:8
//没有初始化去判断字符串是否为空(如果未初始化,长度不存在)
string strEmpty;
if(strEmpty.empty())
{ /*返回值 return length==0成立,字符为空
有一个记录长度的变量,用它和0比较成立,返回1,表示空*/
cout<<"string为空"<<endl; //输出: string为空
}