Pointers 为什么指针和递归被视为一个复杂的问题?

Pointers 为什么指针和递归被视为一个复杂的问题?,pointers,recursion,Pointers,Recursion,最近我读了一篇关于Joel面试一个软件工程职位的文章,他提到在一些简单的谜题之后询问应聘者关于递归和指针的问题 我想知道为什么指针和递归被认为是复杂的问题 更新:如果我可以这么说的话,可以做些什么来提高指针和递归技能 谢谢 它们需要保留有关多个数据层的详细信息。几层比一层更复杂 指针比值变量更复杂。它本身是一个变量,但用于保存另一个变量的地址。您需要掌握指针值和其他变量值之间的差异 递归比带循环的普通代码更复杂,因为您需要掌握当前调用的原因和方式、将进行哪些其他调用、当前调用返回时的效果以及所有

最近我读了一篇关于Joel面试一个软件工程职位的文章,他提到在一些简单的谜题之后询问应聘者关于递归和指针的问题

我想知道为什么指针和递归被认为是复杂的问题

更新:如果我可以这么说的话,可以做些什么来提高指针和递归技能


谢谢

它们需要保留有关多个数据层的详细信息。几层比一层更复杂

指针比值变量更复杂。它本身是一个变量,但用于保存另一个变量的地址。您需要掌握指针值和其他变量值之间的差异


递归比带循环的普通代码更复杂,因为您需要掌握当前调用的原因和方式、将进行哪些其他调用、当前调用返回时的效果以及所有这些如何解决手头的问题。那太复杂了。向此添加间接重复(当
A()
调用
B()
B()
调用
C()
C()
再次调用
A()
时)这真的很有趣。

我想说,因为很多学生在尝试指针和递归之前,对编程基础的掌握不够深入,所以他们过早地感到困惑

此外,学生喜欢影响其他学生,让他们认为一个概念比实际更难


我很幸运地学习了pascal和C作为我的第一种编程语言,因此指针和递归很自然,不会感到复杂。

它们是简单的概念,但很容易出错


这使得指针和递归非常适合于编程难题和面试问题。

有人曾经对我说,我同意——指针是一个简单的概念,但很难编码,递归是一个困难的概念,但很容易编码

指针可能很难编码,因为它可能不清楚问题在哪里,或者甚至不存在问题-指针引起的问题可能不会在第一次、第二次甚至第一百次运行中出现,但突然间,bam,您遇到了问题。调试它们也可能非常困难


递归编码很简单——只需调用函数本身,并做一些事情来跟踪您所在的位置。难点在于确保您对函数可能采用的所有可能路径有足够的了解,并确保它始终能够摆脱循环

递归非常简单,可以在LOGO中使用,LOGO是一种类似于LISP的编程语言,设计用于幼儿。对于许多基本用途来说,这是一个相当直观的概念

另一方面,指针对许多程序员来说似乎很复杂——尤其是那些从未接触过汇编程序的程序员。尤其令人困惑的是,C(和C++)基本上是以几乎可互换的方式处理数组和指针的,尽管它们通常由不同的数据类型表示


例如,指向一维数组的指针数组在源代码中的解引用与二维数组完全相同,即使它们具有完全不同的内存布局,并且在发生解引用时生成相当不同的机器代码。

它们实际上没有那么复杂。在面试测试中使用它们的原因是,好的程序员可以很快解释它们,而坏的程序员可以很快被它们绊倒。因此,他们可以预测候选程序员是否在一般编程方面有问题

为什么指针。。。被认为是复杂的问题吗

实际上有一篇Joel的文章稍微回答了你的问题:在,他说(最初的重点):

我逐渐意识到这一点 理解C语言中的指针不是一个简单的问题 技能,这是一种天赋。第一年 计算机科学课,有 一开始总是大约200个孩子 这学期所有人都写了 复杂的冒险游戏在基本的 他们4岁时的电脑。 他们玩得很开心 在大学里学习C或Pascal,直到 有一天,他们向教授介绍 指针,突然之间,他们没有得到 信息技术他们就是不明白 什么都可以。全班90% 开始成为政治学 少校,然后他们告诉他们的朋友 没有足够的好看 具有适当性别的成员 他们的CompSci课程,这就是为什么他们 转换。出于某种原因,大多数人 似乎生来就没有这个角色 理解指针的大脑。 指针需要一种复杂的 双重间接思维 人们就是做不到,而且很漂亮 对良好的编程至关重要。很多 “脚本运动员”谁开始 通过复制JavaScript进行编程 将代码片段插入他们的网页,然后 继续学习Perl从未学习过 指针,它们永远不会完全正确 生成所需质量的代码

这就是所有这些著名事件的根源 你听到的面试问题, 例如“反转链接列表”或 “检测树结构中的循环。”


很抱歉引用了这么大的一句话,但它就在这里。

理解指针需要从概念上理解计算机系统的内存体系结构:编号内存中的每个地址都是一个可以放置数据的插槽,其中一些插槽包含其他插槽的编号。这不是小事。更重要的是,简单的程序不需要它。在我看来,有了这种概念性的理解并能够用它解决问题表明了一种想弄清楚计算机中到底发生了什么的愿望

此外,要流利地使用指针,你需要练习。想想C拼图,比如:“来自声明程序
int* (*)(int*[]) (a*[])(int *[]*, float[][]**);