c和c++的区别(四)-----内存池之间的区别、string类型

内存池之间的区别

吃蛋糕<----->允许你买一个蛋糕分着吃

内存池<----->允许你申请一段内存,重新分配

允许大家申请一段内存,共给程序使用,综合管理内存

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为空
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值