上一页 下一个

C语言编程基础

指针:为什么?

假设你想要创建一个文本编辑器——一个让你编辑普通ASCII文本文件的程序,比如UNIX上的“vi”或Windows上的“记事本”。文本编辑器是人们创建的一个相当常见的东西,因为如果你仔细想想,文本编辑器可能是程序员最常用的软件。文本编辑器是程序员与计算机的亲密链接——你可以在这里输入你所有的想法,然后对它们进行操作。显然,对于你经常使用和密切合作的任何东西,你都希望它是正确的。因此,许多程序员创建自己的编辑器,并对其进行定制,以适应他们个人的工作风格和喜好。

所以有一天你坐下来开始写编辑器。在考虑了所需的特性之后,开始考虑编辑器的“数据结构”。也就是说,您开始考虑如何将正在编辑的文档存储在内存中,以便能够在程序18新利最新登入中操作它。您需要的是一种方法来存储您所输入的信息,这种方式可以快速而容易地进行操作18luck手机登录。您认为这样做的一种方法是根据行字符组织数据。根据我们到目前为止所讨论的内容,在这一点上您唯一可以支配的是一个数组。您可能会想:“嗯,典型的一行有80个字符长,而典型的文件不超过1000行。”因此,你宣布二维数组,像这样:

广告

char医生[1000][80];

该声明请求一个包含1,000个80字符行的数组。该数组的总大小为80,000个字符。

然而,当你进一步思考你的编辑器及其数据结构时,你可能会意识到三件事:18新利最新登入

  • 有些文档是很长的列表。每一行都很短,但有成千上万行。
  • 一些特殊用途的文本文件有很长的行。例如,某个数据文件可能包含542个字符,每个字符表示的片段中的氨基酸对DNA
  • 在大多数现代编辑器中,您可以一次打开多个文件。

假设您设置一次最多打开10个文件,最大行长为1,000个字符,最大文件大小为50,000行。你的声明现在看起来像这样:

char医生[50000][1000][10];

这似乎不是一件不合理的事情,直到你拿出计算器,用5万乘1000乘10,发现数组包含5亿个字符!现在的大多数计算机对于这样大小的数组都有问题。他们根本没有内存,甚至虚拟内存空间,以支持这么大的数组。如果用户试图在最大的多用户系统上同时运行该程序的三个或四个副本,这将对设施造成严重的压力。

即使计算机接受这样一个大数组的请求,您也可以看到这是对空间的极大浪费。在绝大多数情况下,当您运行这个编辑器查看最多消耗4,000或5,000字节的100行文件时,声明一个5亿个字符的数组似乎很奇怪。数组的问题在于你必须从一开始就声明它在每个维度上都有它的最大大小。这些最大尺寸经常相乘,形成非常大的数字。此外,如果您碰巧需要编辑一个包含2,000个字符的奇怪文件,那么您就不走运了。实际上没有办法预测和处理文本文件的最大行长,因为从技术上讲,这个数字是无限的。

指针就是为了解决这个问题而设计的。使用指针,您可以创建动态数据结构.而不是预先在数组中声明最坏情况的内存消耗,而是分配记忆当程序运行时。这样,您就可以使用文档所需的确切内存,而不会浪费。此外,当您关闭一个文档时,您可以将内存返回到堆中,以便程序的其他部分可以使用它。使用指针,可以在程序运行时回收内存。

顺便说一下,如果你读了前面的讨论,你会有一个大问题,“字节到底是什么?”然后是文章18新利最新登入比特和字节是如何工作的将帮助你理解概念,以及“兆”、“千兆”和“tera”之类的概念。去看看,然后再回来。

特色
Baidu