1、指针的优点和缺点
优点:灵活高效
(1)提高程序的编译效率和执行速度(数组下标往下移时,需要使用乘法和加法,而指针直接使用++即可)
(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。
(3)可以实现动态的存储分配。
(4)便于表示各种数据结构,如结构体,编写高质量的程序。
缺点:容易出错
(1)可能变成野指针,导致程序崩溃
(2)内存泄露
(3)可读性差
2、指针和引用的定义和区别
(1)指针和引用的定义
1)指针:指针是一个变量,存储一个地址,指向内存的一个存储单元;
2)引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
(2)指针和引用的区别
<1> 从内存分配上来说:
1)指针是一个实体,而引用仅是个别名,即为指针分配内存,而不为引用分配内存空间;
<2> 从指向的内容来说:
2)引用只能在定义时被初始化一次,之后不可变;指针可变;
3)引用不能为空,指针可以为空;
4)const与指针搭配可以表示指针指向和指针指向内容是否可变。const与引用搭配只有一种,即来修饰其内容的可读性。由于引用从一而终,不用修饰其指向。
5)指针可以有多级,但是引用只能是一级(int **p;合法,而int &&a是不合法的)
<3> 其他方面
6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
7)指针和引用的自增(++)运算意义不一样;
指针和引用在符号表中的形式:程序在编译时分别将指针和引用添加到符号表上。在符号表上记录的是变量名及变量所对应地址。在符号表上,指针变量对应的地址值为指针变量的地址值,而引用对应的地址值是引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。
3、malloc/free 和 new/delete相关的面试题
1):C++有了malloc/free 为什么还要new/delete?
(1)malloc/free只在申请空间时,它们只需要申请空间,无法对空间进行操作。
(2)而在创建C++的对象时,不仅仅是需要申请空间,还需要自动调用构造函数,以及在对象消亡之前要自动执行析构函数。
因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
根据上面两点,我们可以知道malloc/free 是不能满足C++的需要的,因此需要new/delete。
即在创建对象时,能分配内存空间且初始化内存 + 销毁对象时,能回收空间且对内存进行清理的new/delete。
2)为什么malloc/free在申请空间时,它们只能申请空间,无法对空间进行操作?
因为:malloc/free 是库函数,使用它需要头文件,在一定程度上是独立于语言的。编译器在处理库函数时,编译器不需要知道它是做啥的,而仅仅需要对该函数进行编译,并且保证调用函数时的参数和返回值是合法的,并生成相应 call 函数的代码就ok了。编译器不会控制库函数做一些操作,比如调用构造函数和析构函数。因此malloc/free无法满足动态生成对象的要求。
3)为什么new/delete 在申请空间时,它们不仅能申请空间,还能调用构造函数或析构函数对对空间进行操作?
因为:new/delete是运算符,它与+-*/的地位 是一样的。编译器看到new/delete时,就知道只要它要做啥操作,并生成对应的代码。
4):malloc/free 和 new/delete 的相同点和不同点
相同点:它们都可以申请和释放空间。
不同点:
一、new/delete 在申请空间的时候能对空间进行操作,而malloc/free 不能。
(1)new :分配内存 + 调用类的构造函数 + 初始化 delete:释放内存 + 调用类的析构函数
(2)malloc:只分配内存,不会进行初始化类成员的工作 free只释放内存,不会调用析构函数
二、new/delete是C++运算符,能重载
(1)new、delete 是运算符,可以进行重载
(2)malloc,free是标准库函数,不可以进行重载,但可以覆盖。