为什么大厂笔试喜欢考数据结构?

在程序员眼中,应该只有内存地址,那么什么是内存地址呢?

内存地址是物理内存的虚拟地址,内存地址就是由字节组成,程序中经常提到的字节就是这个,一个字节是8个bit,bit的意思就是我们经常听到的0和1,0和1可以组成很多信息,计算机把我们常用的字面量都映射成了数字,比如a就映射成了97,这样我们取97的时候,就可以在
显示器上呈现出a,世间的万物都可以明码标价,程序中的一切都可以用数字表示,可以理解成其实这个数据存在计算机中的是97的二进制,明白了这个,对于字节数组,字符串,字节就理解了,对于64位机器来说,内存地址是:2的64次方,从0到4GB的数值排列(0xc000016050,内存地址用16进制表示,我们的指针就是这么来的),内存对齐需要知道,64位地址,CPU是每8个周期轮一下,所以你的数据类型如果大于8个字节剩下来的字节,如果不能存放满,不能在剩余的地址里存着,必须换到下一个8个字节的首地址
有了内存地址,操作系统会通过寻址找到存相应变量的首地址,指针就是变量在内存中存储的首地址。

如何理解API

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,
目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

如何理解变量

变量的概念 既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。

在这里插入图片描述

从上面的图我们可以看到定义了一个a变量,在内存中,为a分配了4个字节的内存用于存储a这个变量的值,
同理,double b定义了一个double类型的b变量,这时,在内种为b变量分配的内存空间则是8个字节。

变量只是内存中的一个标号,通过变量操作内存。
我们要明白,为变量赋值,是向变量所代表的内存空间中写数据,而不是向变量读写数据。

那么接下来你不禁会问变量i存放在哪呢?

在这里插入图片描述
变量的值可以变化,可以利用它灵活读取和存取数据,从而避免很多繁杂重复的工作。

如何理解内存的分区和用途

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。

扫描二维码关注公众号,回复: 11443806 查看本文章

堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。[注] 堆和自由存储区一般认为是同一名词。 或者,自由存储区的一部分被开成堆,剩下的则是未使用。堆和栈都可以在自由存储区里进行自动扩展,直到2者相接而成为内存耗尽。

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)[注] 常量存储区则是“全局/静态存储区”的一部分,在os支持常量段的情况下,编译器可以把一部分const的全局变量放在这个位置。而且,这个“全局/静态存储区”并没有被C、C++标准给出名称,都是俗称,各个资料上可以名字差异很大。

内存中,堆和栈的区别

主要的区别有以下几点:
1、管理方式不同;
2、空间大小不同;
3、能否产生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;

内存分配方式

[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
[3]从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释 放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大 小的堆空间将会产生堆内碎块。

程序由下面几部分组成

栈:局部变量以及每次函数调用时所需要保存的信息都存放在此区域中。每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。然后最近被调用的函数在栈上为其局部变量分配存储空间。

堆:堆用于存放程序运行中被动态分配的内存,大小并不固定。

bss段:也叫未初始化数据段,存放程序中未初始化过的全局变量和静态变量,在程序开始执行之前,内核将此段的数据初始化为0。

数据段:也叫初始化数据段,存放程序中已经明确地初始化的全局变量和静态变量。(如C程序中任何函数之外的声明)

正文段:存放程序的执行代码,它的大小在程序运行前就已经确定。通常,正文段是可以共享的,多个此程序执行的进程在内存中只需要一个副本。另外,正文段常常是只读的,以防止程序由于意外而修改指令。该段也可能包含一些只读的常数,如字符串常量等。

指针栈空间与堆空间

在这里插入图片描述

什么是算法的时间和空间复杂度

算法的时间和空间复杂度,实际上是数据存储的空间和操作的时间复杂度

算法能力能够准确辨别一个程序员的技术功底是否扎实;
算法能力是发掘程序员的学习能力与成长潜力的关键手段;
算法能力能够协助判断程序员在面对新问题时,分析并解决问题的能力;
算法能力是设计一个高性能系统、性能优化的必备基础。

怎样具备解决问题的能力

想要具备解决问题的能力,首先要理解问题。
解决问题的能力,这个主题有点宽泛,却是大厂最喜欢考察的东西。
比如面试官拿出一道你没见过的算法题,往往是很容易让你产生畏难情绪的,如果你放弃思考直接回答不会,那你就输了。
题目可能很难,但是面试官想看到的是你思考的过程,以及解决问题的能力,如果你可以介绍自己的思路,给出一些解决方案,就算题目真的不会写,可能也会给面试官比较正面的印象。当然,如果你有很多题都不会,那可能你解决问题的能力也就这样了。

除了算法题,智力题也是一种常见的面试题型,这些题目可能涉及概率论、博弈论,题目本身不会很难,你应该给出你的解题思路和思考过程,面试官一般也会引导你打开思路,这类题目也很能反映一个人解决问题的能力。

如果你有项目经历或者实习经历,那么面试官往往会问你在项目中负责什么,遇到了哪些困难,又是如何解决的,其实也是为了考察你解决问题的能力。

如果你能很清楚地介绍你所做的东西,并且能够告诉面试官自己通过努力解决了项目中的一些难题,一定会让面试官对你刮目相看,当然,前提是你真的做过这些项目,克服过这些困难,简历造假就是搬起石头砸自己的脚。

猜你喜欢

转载自blog.csdn.net/qq_21950671/article/details/107318669