C++面经学习day1

237 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题一:指针和引用的区别?

(1)指针指向的是一个新的地址变量,可以通过访问指针中存放的地址实现对变量的修改;引用只是变量的一个别名,对于引用进行操作,就如同直接操作变量本身。

(2)指针一般为四字节大小;引用的大小取决于变量本身的大小。

(3)指针可以为NULL;引用不可以。

(4)指针可以有多级;引用只能有一级。

(5)在利用指针传参时需要解引用才能实现变量的修改;引用可以直接对变量进行修改。

问题二:什么是指针的解引用

指针的解引用就是寻找指针所指向的地址内的内容,例如p指向地址a,*p就是对指针p进行解引用。

问题三:在对函数进行参数传递时,什么时候使用指针,什么时候使用引用

(1)当函数需要返回函数内部局部变量的地址时,需要使用指针传参,使用指针时需要开辟内存地址,用完需要进行释放,避免引起内存泄漏。

(2)由于局部变量具有一定的生存周期,函数结束变量被释放,所以返回引用没有意义。不过,当对栈的空间大小比较敏感时(递归)使用引用,使用引用传递临时变量无需开辟内存,开销小。

问题四:堆和栈有什么区别?

(1)堆是由程序员通过new和malloc手动开辟的一块内存;栈是由编译器自动开辟和管理的内存,用于存放函数和一些局部变量。

(2)堆由于频繁的开辟和释放空间操作会产生内存碎片。

(3)堆的空间向上,逐渐变大;栈的生长空间向下,地址逐渐变小。

问题五:堆快一些还是栈快一些?

(1)栈更快一些,主要原因是操作系统的支持,会为其分配专门的寄存器存放栈地址,并且有专门的指令集,因此栈的效率较高。

(2)堆是由程序员手动控制,在使用new和malloc函数申请内存时需要按照需求寻找合适的大小,每次获取内容需要访问两次,第一次访问指针,第二次实现地址的解引用。

解引用操作的代码表示方式

#include <iostream>
using namespace std;
int main(){
    // 定义指针和变量
    int *p ,a=7;
    // 将指针指向变量的地址
    p=&a;
    cout<<p<<endl;
    // 输出的是变量的值,通过指针的解引用得到
    cout<<*p<<endl;
    cout<<&*p<<endl;
    cout<<*(&*p)<<endl;
    return 0;
}

程序执行结果如下

捕获.PNG