分享

C语言快速入门——指针与数组

 星之梦灬逝去爱 2018-02-25

与数组有关的地址

我本来打算以一个程序开始,让我们直接理解相关概念。但转念一想,如果引导你思考问题而得出结论,或许会有另一种效果,因此,我们的讨论以下面的定义为基础。

程序中定义的每个变量都对应一个具体的地址。我们可以使用&a取到变量a的地址。现在我们将这个规则应用到数组上思考一下。首先,&b肯定也可以取得一个地址。再次,我们从数量上思考。a只对应一个数据,但b是数组,数组存储的是同一类型的多个变量,那&b应该是那个元素的地址呢?

现在想像你面前有一摞盘子(或一包抽纸),每次从顶上抽取一个总比从中间或底部来的轻松方便。语言设计也是如此。如果&b代表的是b[1](第二个元素)的地址,那访问上一个元素就需要减去某个偏移,访问下一个就需要加上偏移。试想这种情况会应用到循环语句中,那为了使用地址遍历数据(即,间接访问),在每次进入循环前还需要调整到开头地址,这种违背常理、人性、天理不容的设计会让人咒骂。所以,有些东西的设计不单单是能用,还要便利。

由此我们暂时可以推断出,数组名与数组第一个元素有关,这样才能方便连续访问。下面我们用程序说明。

示例代码的注释中已经给出了足够多的信息。以前有过使用%x输出地址,更正规的是使用%p格式符。根据最后三行输出,我们可以看到数组的另一个特性:数组中的所有元素在内存中都是连续存储的。这也是数组支持随机访问(如a[1], a[5], a[9])的原因。

数组传递到函数

我们不能把一个数组赋给另一个数组以达到拷贝元素的目的,通常这需要我们手动完成。我们在《数组传递到函数》一文中曾提到过把数组传递给函数时,数组类型事实上被转换为指针类型了。现在我们使用指针来编写几个关于数组的函数。

在客户端程序中,我们测试了数组的拷贝函数与变换函数,两个函数的内部已经有足够的注释,以帮助我们理解的更多。希望你能掌握数组名与地址,数组元素与地址的关系,以及基于下标和指针这两种访问方式。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多