栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c和c++的区别(三)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c和c++的区别(三)

动态内存申请的区别

c语言的动态内存申请-->由函数申请

malloc:不带初始化的;

calloc:带初始化的,初始化为0;

realloc:重新申请(在原内存的后面接着申请);

c++的动态内存申请-->由关键字申请

只有new(申请)和delete(释放)

~单个变量内存申请

~数组的动态内存申请

~结构体的动态内存申请

单个变量的内存申请

申请单个内存不做初始化

void testoneMemory(){
//申请一个整型变量的内存,不做初始化,让指针指向一个变量的内存
       int*pInt=new int;
//申请完内存后,可以当变量来使用

       *pInt=123;
       cout<<*pInt< 

ps:可以new其他类型,只要注意格式即可

void testoneMemory(){
//申请一个字符型变量的内存,不做初始化,让指针指向一个变量的内存
       int*pChar=new char;
//申请完内存后,可以当变量来使用

       *pChar='a';
       cout<<*pInt< 

申请单个内存并做了初始化

//用()可以给单个数据初始化
void testoneMemory(){

       int*pInt=new int(124);  //用()给当前申请的整型变量的内存初始化为124

       cout<<*pInt< 

单个变量的内存释放

    delete pInt;
    pInt=Nullpstr;//释放后置空即可

小知识:

如何申请一大串内存?

申请一串内存不做初始化

用一维数组方式申请

void testArrayMemory(){

        //申请一段内存用一维数组方式申请
        int*pInt=new[3];       //[]中代表长度,可以是常量、变量,只要是值就可以了

                               //'A'也可以,自动转换成65

        delete pInt;  //这样释放也可以,推荐用下行的方式增加可读性

        delete pInt[];//用了[]代表当前这个变量是一段内存

        pInt[]=pstr;  //释放完后置空
         
}

小知识:

让用户输入也可以

    int num=0;
    cin>>num;
    int* pInt=new int[num];

用字符串方式申请

#include//c语言的string
#include    
using namespace std;
int main(){
    char* pstr=new char[15];        //char* 不能直接赋值
    strcpy(pstr,"i love you");      //处理字符串通常用拷贝的方式
//strcpy_s(pstr,15,"i love you"); 增强版
    cout< 

小知识:

char* 不能直接赋值,处理字符串尽量用strcpy的方式

"i love you"是指向常量区的内存,没有赋值到堆区上

#include//c语言的string
#include    
using namespace std;
int main(){
    char* pstr=new char[15];   //char* 不能直接赋值,这样写数据没有赋值到new char[15]上
    pstr="i love you";      
                            //解决方案:const char* pstr=new char[15];   
    cout< 

new char[15](堆区)上没有任何数据,这段内存没有初始化,输出乱码

把pstr的指向改变了,不影响pstr申请的内存

#include
#include    
using namespace std;
int main(){
    const char* pstr=new char[15];     //pstr指向new char[15]
    const char*pstr1=pstr;             //pstr1指向pstr,指向同一块内存
    pstr="i love you";                 //pstr改为指向"i love you"
    cout< 

小知识:

释放有且只有两种方式:

delete 指针<----------->单个变量内存释放

delete[ ] 指针<--------->一段内存释放---->[ ]中不用填释放长度、不存在[ ][ ]的情况--->基本语法

~用一维数组方式申请一串内存并做了初始化

//用{ }可以给一段内存初始化,未初始化的参数默认为0
void testArrayMemory(){

        //申请一段内存,用一维数组申请并初始化
        int*pNum=new int[3]{1,2,3};        
        for(int i=0;i<3;i++){                     
           cout< 

~用字符串方式申请一串内存并做了初始化

    //字符数组方式初始化
    char* str=new char[20]{'A','B','C'};//未初始化的参数默认为0
    cout< 

结构体动态内存申请

struct Student  //结构体
{    
    int age;
    char* name;  //char name[20];

};
void teststructMemory(){
            //new一个对象
//结构体动态内存申请和整型变量动态内存申请类似   int* p=new int(23);
            Student* pstu=new Student; //未学构造函数前,结构体只能用{ }初始化    

}

结构体的内存申请并做了初始化 

struct Student//定义一个结构体
{    
        int age;
        const char* name;
    void printstu()        //成员函数
    { 
        cout< 

结构体申请内存时初始化修改出现会问题(由const导致的)   

ps:建议结构体申请内存后再初始化

struct Student//定义一个结构体
{    
        int age;
        const char* name;
    void printstu()        //成员函数
    { 
        cout<name=new char[18];
        strcpy(pstu->anme,"i love you");//报错 可以给它拷贝了一段内存,但不能修改
      
}

结构体的内存申请之后做初始化

struct Student//定义一个结构体
{    
        int age;
        char* name;
    void printstu()        //成员函数
    { 
        cout<age=19;
        pstu->printstu();
      
}

(结构体里面有指针,要做2次申请,才能strcpy或者赋值)

struct Student//定义一个结构体
{    
        int age;
        char* name;
    void printstu()        //成员函数
    { 
        cout<name,20,"张三");
        pstu->age=19;
        pstu->printstu();
      
}

结构体的内存释放

先申请的,后释放

申请顺序和释放顺序相反

反过来会中断,出现内存的重复释放,pstu不存在,怎么释放pstu的name?

struct Student//定义一个结构体
{    
        int age;
        char* name;
    void printstu()        //成员函数
    { 
        cout<name,20,"张三");
        pstu->age=19;
        pstu->printstu();
        delete[]pstu->name;
        delete pstu;//1个结构体变量的内存释放
      
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/528806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号