首页 > 编程语言 >C++面试八股文:聊一聊指针?

C++面试八股文:聊一聊指针?

时间:2023-06-23 23:47:35浏览次数:35  
标签:八股文 int 0x00001000 C++ 地址 聊一聊 内存 师兄 指针

C++面试八股文:聊一聊指针?

某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:

面试官:聊一聊指针?

二师兄:好的。

面试官:你觉得指针本质上是什么?

二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x000000000x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化它时:

int a = 42;

二师兄:操作系统会分配一块容量为4(sizeof(int))的地址,这块内存的首地址是0x00001000(假设),结束地址是0x00001003,在申请的这4个字节上放入42。当我们对这个变量取地址时,

int a = 42;
int* p = &a;

二师兄:操作系统会再分配一块内存,这块内存的大小是sizeof(int*),这块内存的起始地址是0x00002000(假设),结束地址是0x00002003(32位操作系统),然后将&a取到的起始地址0x00001000放入0x00002000-0x00002003中。并将刚分配的这块内存的起始地址赋给p

二师兄:当我们对p操作时,是对0x00002000-0x00002003这块内存操作,当我们对*p(解引用)操作时,是对0x00001000-0x00001003这块内存操作。

二师兄:回到问题,我觉得指针的本质就是内存地址。虽然指针指向一块内存地址,但它同时也是一个变量,也可以对指针取地址。如果对指针取地址,同样可以得到一个内存地址(如0x00002000),如果把这个内存地址存起来,那么指向这个内存地址的变量的类型就是二级指针(int**)。

面试官:好的。在0x00002000-0x00002003这块内存中,我们放入了一个地址是0x00001000,但是并没有这个地址的长度。只知道一个地址而不知道长度,怎么能把数据取出来?

二师兄:这主要是因为p的类型是int*,当对p解引用时,编译器知道了解引用的结果是int类型,所以从0x00001000往后读取4个字节(sizeof(int)),并按照当前CPU的模式(考虑大小端)把这四个字节组成一个int类型的变量。

面试官:malloc函数你知道吧,返回的类型是void*,在free的时候怎么知道这块内存的大小的呢?

二师兄:额。。这个还不太清楚。。

面试官:没关系,今天就到这里,回去等通知吧。

让我们来看看让二师兄折戟的这个问题:

malloc函数返回的类型是void*,在free的时候怎么知道这块内存的大小的呢?

这里牵扯到mallocfree的实现方式,不同的厂商实现的方式不尽相同。以ptmalloc为例,当使用malloc申请size = 16的内存时,malloc会从内存池中分配一块sizeof(chunk)+16长度的内存。chunk段保存了一些前后chunk的信息,也保存了这块内存的大小(16)。malloc函数返回的地址是0x00001000,而在free(0x00001000)时,free函数会用0x00001000减去特定值(sizeof(chunk)),得到chunk的起始地址,从chunk中获取这块内存真正的尺寸,从而完成free的任务。抛开内存的利用率不说,这是一个非常美妙的实现!

标签:八股文,int,0x00001000,C++,地址,聊一聊,内存,师兄,指针
From: https://www.cnblogs.com/bujidao1128/p/17500492.html

相关文章

  • C++面试八股文:std::vector了解吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第23面:面试官:vector了解吗?二师兄:嗯,用过。面试官:那你知道vector底层是如何实现的吗?二师兄:vector底层使用动态数组来存储元素对象,同时使用size和capacity记录当前元素的数量和当前动态数组的容量。如果持续的push_back(emplace_ba......
  • 《C++》员工管理系统
    学习差不多了,来小项目已经做两个晚上了目前只实现了批量添加和显示,数据结构采用链表......
  • C++ 类的基础知识
    1.类的定义类就是数据类型,是用户定义的数据类型,对象可以看成某个类的实例(某个类的变量)。所以说类是对象的封装,对象是类的实例。在类中定义的成员函数,都是inline函数。2.类的修饰符public、protected、private.public进行修饰的成员表示的是该类可以提供的接口、功能、或......
  • Window下的socket编程(c++实现)
    参考https://www.cnblogs.com/L-hq815/archive/2012/07/09/2583043.html 效果图: Sever.cpp点击查看代码#include<winsock2.h>#include<iostream>#include<string>usingnamespacestd;#pragmacomment(lib,"ws2_32.lib")intmain(intargc,......
  • C/C++经典面试题1(精心整理,附参考答案)
    1.说一下static关键字的作用2.说一下C++和C的区别(1)设计思想上(2)语法上3.说一说c++中四种cast转换(1)const_cast(2)static_cast(3)dynamic_cast(4)reinterpret_cast(5)为什么不使用C的强制转换?4.请说一下C/C++中指针和引用的区别?5.给定三角形ABC和一点P(x,y,......
  • 2021最新C++面试题(附答案)
    今天分享给大家的是比较全面的C/C++面试题,也都是C++版本升级之后,重新整理归纳的最新答案,会让C++面试者少走很多不必要的弯路。同时每个C++面试题都尽量做到了详尽的面试解析文档,以确保每个阶段的读者都能看得懂,同时这部分C++面试文档也是可以免费的提供给有需要的同学们学习的!博......
  • c++面试题(亲测常问)
    注意:此题为我自己面试被问到的,及一些摘抄的,如有侵权请联系我马上删除!1. 2.32位指针地址所占字节数为四举例说明:char*p;chartest[10];p=test;sizeof(p)=4(32位系统)//实质是求指针类型所占字节数,32位对应4字节,64位对应8字节sizeof(*p)=1//实质是求指针所指的内容所在......
  • C++面试题汇总
    目录1、C++三大特性1.1封装1.2继承1.3多态2、C++中map与unordered_map的区别3、unordered系列关联式容器4、STL常用函数,容器和使用容器的方法5、map的底层实现,存储的是什么,实现的时间复杂度6、虚函数6.1什么是虚函数6.2虚函数和纯虚函数的区别7、C++set和map......
  • c++面试常见问题总结
    近来在面试的过程,发现面试官在c++方面总是喜欢问及的一些相关问题总结,当时没怎么答出来,或者是答的不怎么全面,故而查询相关资料总结下。(后面实际工作会进行实时更新信息)<一>c++虚函数方面虚函数(VirtualFunction)是通过一张虚函数表(VirtualTable)来实现的。简称为V-Table。在......
  • c++面试知识整理
    C++基础部分1.基础知识1.1内存1.1.0内存四区1.1.1简述C、C++程序编译的内存分配情况1.1.2分配函数与释放函数1.2预编译1.2.1头文件<><><>和“““”””的问题1.2.2constconstconst与#definedefinedefine相比有什么优点1.3宏,内联函数1.3.1内联函数1......