分享

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

 静幻堂 2019-09-07
皮拉夫大王编程 2019-09-02 08:13:00

与数组有关的地址

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

int a = 9;
int b[3] = { 0, 1, 2 };

程序中定义的每个变量都对应一个具体的地址。我们可以使用&a取到变量a的地址。而数组是一组内存空间连续的存储,数组中可以有多个元素,而这么多元素却只有一个符号(b),那么它应该代表哪个元素的地址呢?

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

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

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

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

由输出可以看到,数组名与数组第一个元素的地址一样,这代表数组名同时也代表数组首先的地址;但是请注意,&a与a的地址虽然一样,但它们的意义是完全不一样的!

数组传递到函数

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

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

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

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

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多