面试题之C++(一)

从今天开始每天一道面试题持续更新:

1.指针和引用

  1. 引用总是指向一个对象,没有空引用,而指针可以指向一个对象也可以指向空(nullptr)
  2. 指针可以被重新赋值,而引用不行,引用永远指向初始化的值
  3. 指针指向一块内存,指针的内容是内存的地址;而引用是某块内存的别名(指针是一个实体,而引用是别名)
  4. 引用没有const,而指针有const,const指针不可以改变
  5. sizeof(引用)得到的是引用所绑定的对象的大小,而sizeof(指针)得到的是指针本身的大小
  6. 指针和引用的自增(++)运算意义不一样;指针是指向下一块内存的地址,引用是调用对象本身的自加运算符
  7. 引用比指针多了类型检查,所以引用是类型安全的,而指针不是
  8. 想要获得指针指向的对象必须用*操作符对指针解引用,而引用不需要

总结:从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化。

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。

2.堆和栈的区别

一个由C/C++编译的程序在内存中占几个部分:
1.栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2.堆区:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3.全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4.文字常量区:常量字符串就是放在这里的,程序结束后由系统释放。
5.程序代码区:存放函数体的二进制代码。
区别:
1.栈由系统自动分配,堆由程序员自己申请,并指明大小
2.栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢
出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表
中删除,并将该结点的空间分配给程序,另外

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值