指针和数组,指针和引用,new/delete和malloc/free的联系或区别

1、指针和数组

(1)数组:是存放一定数量的变量的内存空间;

直接输出数组名可以得到数组首元素的地址;

数组的元素在内存中是连续存放的(存放在静态存储区或栈上);

(2)指针:指针变量是用来存放某种类型的地址的变量;

指针很灵活,存储空间不能确定;

(3)二者联系:

一个数组名可以复制给一个指针,赋值后的指针指向数组的首元素;

数组名可以向指针一样运算,Eg:*(arr + 1)  =  arr[1];

指针操作数组快于下标操作数组;

在作为参数传递的时候,数组等同于指针(数组名相当于数组首元素的地址);

同类型的指针可以相互赋值,但是数组不可以;

(4)指针数组:是数组,数组的每个元素存放的是一个指针类型的元素;

Eg: int* arr[8];(其中[]的优先级高于*)

(5)数组指针:是指针,该指针指向一个数组;

Eg: int (*arr)[8];

(6)函数指针:类型+(*)();

2、指针和引用

(1)二者区别:

指针是变量,引用是别名(在内存中占同一个存储单元);

指针可以为空,可以在任何时候初始化,引用不可以为空,在创建的时候必须初始化;

可以有const指针,但是没有const引用;

指针可以有多级,但是引用只有一级;

指针的值初始化后可以被改变,即指向其他存储单元,引用在初始化后不能被改变;

指针作为函数参数传递时,传进来的是实参的一个拷贝,而引用传递参数时传递的是参数本身;

3、new/delete和malloc/free

new的底层是malloc,delete的底层是free;

(1)二者区别:

new/delete是C++的关键字,需要编译器支持,malloc/free是库函数,头文件支持;

new无需指定所申请的内存块大小,编译器或根据类型信息计算,malloc需要显示的指出内存的大小;

Eg:int类型数组申请10个单位的大小

        int* arr[] = new int(10);        int* arr[] = (int*)malloc(sizeof(int)*10);

new内存分配成功时,返回的是对象类型的指针,无需进行类型转换,所以更安全,而malloc内存分配成功时,返回的是void*,需要进行强制类型转换(如上面的例子);

new内存分配失败时,会抛出bac_alloc异常,而malloc会返回NULL;

new会先调用operator new函数申请足够内存,然后调用类类型的构造函数,初始化成员变量,delete会先调用析构函数,然后调用operator delete函数释放内存,而malloc和free只能动态的申请或释放内存,无法强制要求其左自定义类型的构造和析构;

new和delete可以重载,malloc和free不可以重载;

new从自由存储区为对象动态分配内存空间,malloc从堆上动态分配内存;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值