C++面试八股文:聊一聊指针?
2023/6/18 1:22:27
本文主要是介绍C++面试八股文:聊一聊指针?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:
面试官:聊一聊指针?
二师兄:好的。
面试官:你觉得指针本质上是什么?
二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从
0x00000000
到0x3fffffff
,每一个字节都对应一个地址。当我们声明一个变量并初始化它时:
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
的时候怎么知道这块内存的大小的呢?
这里牵扯到malloc
和free
的实现方式,不同的厂商实现的方式不尽相同。以ptmalloc
为例,当使用malloc
申请size = 16
的内存时,malloc
会从内存池中分配一块sizeof(chunk)+16
长度的内存。chunk
段保存了一些前后chunk
的信息,也保存了这块内存的大小(16)。malloc
函数返回的地址是0x00001000
,而在free(0x00001000)
时,free
函数会用0x00001000
减去特定值(sizeof(chunk)
),得到chunk
的起始地址,从chunk
中获取这块内存真正的尺寸,从而完成free
的任务。抛开内存的利用率不说,这是一个非常美妙的实现!
好了,今日份面试到这里就结束了。关注我,每天带你学习一个C++小知识!
关注我,带你21天“精通”C++!(狗头)
这篇关于C++面试八股文:聊一聊指针?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-01巧用 TiCDC Syncpoint 构建银行实时交易和准实时计算一体化架构
- 2024-05-01银行核心背后的落地工程体系丨Oracle - TiDB 数据迁移详解
- 2024-04-26高性能表格工具VTable总体构成-icode9专业技术文章分享
- 2024-04-16软路由代理问题, tg 无法代理问题-icode9专业技术文章分享
- 2024-04-16程序猿用什么锅-icode9专业技术文章分享
- 2024-04-16自建 NAS 的方案-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数, 加上remote_src: yes 配置-icode9专业技术文章分享
- 2024-04-14ansible 检测远程主机的8080端口,如果关闭,则echo 进程已关闭-icode9专业技术文章分享
- 2024-04-14result 成功怎么写-icode9专业技术文章分享