C++面试常见题目3_指针和引用,堆和栈

  • 指针和引用的区别
  1. 指针是一个实体(变量),内容为所指向内存的地址;引用是一个变量的别名。
  2. 引用不可以为空,当被创建的时候,必须初始化;而指针可以是空值,可以在任何时候被初始化。
  3. 引用只能在定义时被初始化一次,之后不可变;指针可以改变所指的对象。
  4. 引用和指针的自增(++)运算意义不一样。引用为值增加,指针为地址增加。
  • 堆和栈的区别

  • 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值局部变量的值等。其操作方式类似于数据结构中的栈。
  • 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
  • 申请响应
  1. 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出
  2. 堆:首先应该知道操作系统有一个记录空闲内存地址链表,当系统收到程序的申请时,会遍历该链表,寻 找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
  • 申请限制
  1. 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
  2. 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。‘
  • 效率比较

  1. 栈由系统自动分配,速度较快。但程序员是无法控制的。
  2. 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

本系列文章目的为个人准备面试的简单总结,文中多有不足,敬请批评指正!

参考:

https://blog.csdn.net/Fiorna0314/article/details/49757195

https://www.cnblogs.com/mysticCoder/p/4921724.html

https://www.cnblogs.com/gofighting/p/5440012.html

猜你喜欢

转载自blog.csdn.net/zzhang_12/article/details/81033555