如何学习C语言指针?

4

我已经大量使用过指针,但每当我使用它们时,我仍然觉得可能会有一些意外情况发生。我的思维并不确定它们的行为方式。

您有什么建议吗?我想更好地学习指针。


你有关于指针使用的不确定的例子吗? - Greg Hewgill
没有什么特别的,只是我总是不确定指针,尽管我的代码大多数都是正确的。 - Moeb
8个回答

9

7
最好的方法是编写程序。拿到K&R,学习基础知识并开始编写一些程序。
示例问题可能包括:
1)单链表,双向链表。
2)基本树问题。
-- 将值插入树中。
-- 查找高度、深度、删除树等。

3
我建议阅读 Kernighan 和 Ritchie 的“C程序设计语言”。第5章涉及指针和数组。这本书写得非常清晰,包含插图来演示概念,并且还有练习可以进行练习。更好的是,这本书很短小。

3
无论你翻阅这本书多少次,每一次你都会发现新的东西可以学习。 - Duleb

2
仔细完成所有可以在网上找到的练习题 -- 例如这个这个等(如果你只关心C语言,可以跳过C++特定部分,比如“引用”)。务必仔细研究或排练每个练习中给出的先决条件材料(如果有的话)。完成后,将你的解决方案代码与官方解决方案中给出的代码进行比较--它们是否都可以编译并在给定的示例上完全一致地工作?对于稍微广泛的变体呢?任何疑问都可以在stackoverflow上提问!-)

如果你想检查自己的水平,可以随时要求更多的练习题,如果你还没有在网上找到足够多的练习题--像“原地反转单向链表”或“给定指向节点的指针,从单向链表中删除一个节点”这样的简单但关键的问题是经典的,但真正理解它们仍然是衡量自己在指针问题上的好方法。(单向链表是困难但重要的指针练习的好来源...这可能是为什么现在仍然使用的C++标准只提供向链接列表的部分原因,它们只产生了不那么“有趣”的问题!-)。


1
简而言之 - 指针只是一种间接技术。例如,不直接(按值)向例程传递数字,而是只需传递存储数字的地址,以便需要它的例程可以在该地址查找它。现在这很有趣,因为拥有该地址的人可以更改存储在该地址处的值 - 所有其他持有者都可以看到该更改的结果。
当进行指针算术或函数指针时,可能会出现许多混乱的语法,但是如果您给自己一些时间来思考它(并玩几个简单的示例),指针的基本概念就很简单。
祝你好运,
保罗

1

我同意Duleb的观点,只需编写一些代码。

但是,为了帮助您理解,可以画出正在进行的内容,因为您可能有指针数组,并且需要遍历,因此您有指向指针的指针。

通过绘制图表,您可以可视化正在发生的事情,过一段时间后,您可能会发现自己在脑海中绘制这些图像,这将更加清晰明了。

不幸的是,在您习惯使用指针之前,它们可能仍然是一个谜。 我认为您无法仅通过阅读书籍来理解如何使用它。


1

尝试一下汇编语言。这将会让你非常快速地了解指针的实际含义。


0

要记住,在本质上,所有数据操作、所有数据结构、所有的类型,都只是在移动或追踪存储在内存中的比特。

理解整数数组只是一个大小为1个整数乘以数组元素数量的内存块,意识到结构体没有什么魔法分隔符或元比特漂浮在内存中将成员变量分开,有助于你记住(实现?)C程序设计的禅意。

你想更好地学习指针吗?学习void指针。它是最纯粹的指针形式,没有任何偏见,思考一下你可以从内存中相同的位值中实现什么样的值。

最后一切都是虚幻的——放弃对不灵活类型的依赖——并记住内存中的比特。指针比整数或字符更加纯净,而void指针则是其中最纯粹的。

我认为,这是每个程序员都知道但很少人实现的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接