算法精解八(C语言版)

来源:互联网 发布:葵花宝典数据库修改 编辑:程序博客网 时间:2024/05/17 06:11

数据集合与指针的算术运算

指针在 C语言中最常见的用途就是用来引用数据集合。数据集合是由多个相关的元素构成的数据。C语言支持两种数据集合:结构和数组。(虽然联合与结构类似,但一般它单独被归为一类。)

结构

       结构通常是由各种各样的有序的元素组成的,从而它可以被看做单个连续的数据类型。结构指针是构建一个数据结构的重要组成部分。结构使我们能把数据捆绑在一起,指针使我们能够这些捆绑包在内存中一个一个连接起来。用这些连接起来的结构,我们可以对他们加以组织并用来解决实际问题。

这里有一个例子,考虑把内存中一些元素组合起来形成一个链表(见第5章)。要做到这一点,我们可能会使用下面代码中所示的像listElmt一样的结构,用每个元素的net来指向下一个元素的data指向此元素所包含的数据。一旦生成了这样的一个列表,就可以用next指针遍历整个链表。

结构ListElmt也指出了关于结构指针的另一个重要方面;结构不允许包含自身的实例,但可以包含指向自身实例的指针。这种编程思想非常重要,因为很多数据结构都可能是由它自身的结构变量所组成,例如,在一个链表中,每个ListElmt结构都指向另一个ListElmt结构。有些数据结构甚至会包含多个由自身结构类型组成的结构,例如,在一个二叉树中(见第9章),每一个节点同时指向其他两个二叉树的节点。

数组

       数组是在内存中连续排列的痛类元素的序列,在C语言中,数组与指针密不可分。事实上,当一个数组表示符在表达式出现时,C语言显然会把数组转换为一个指向数组的第一个元素的固定指针。考虑到这一点,可以两个函数是等价的。

为了理解C语言中的指针与数组的关系,我做如下解释。我们知道要访问一个数组的第i个元素,用表达式:

  a[i]

之所以此表达式能够访问a的第i个元素,是因为在C语言中,这个表达式与指向a的第一个元素的指针表达意思相同,也就是说,该表达式等同于以下表达式:

*(a+i)

此表达式实际上是使用指针运算的规则来访问元素的。简单来说,当对指针进行加一个整数i操作时,实际得到了一个地址,这个地址由a所在的地址加上数据类型a所含字节数乘以i得到;而并不是简单地在a所在的地址上加i个字节.当从指针中减去一个整数时也是执行类似的操作。这样我们也就解释了为什么数组的索引是从0开始的,因为数组的第一个元素在位置0.

例如:如果一个指针或数组包含5个4字节的整数,并且起始地址为0X1000 0000,那么a[3]访问的地址为0x1000 000c。这个地址是由0X1000 0000加上3X4=12=0xc得到的(见图2-3a)。另一方面,当数组或指针引用的是20个字符变量时,a[3] 将访问地址0X10 000 003处的字符。这个地址是由0x1000 0000加上3x1=3=0x3得到的(见图2-3b).

当然,通过数组或指针引用一块数据与引用多块数据并没有什么不同,因此,很重要的一点是必须对数组或指针所引用的数据空间大小保持警惕,决不能越雷池一步。

把一个多维数组转换为指针与把一维数组转换为指针的过程类似,但是同时要知道在C语言中,多维数组其实是一行主序的方式存储的,这也就说明多维数组右边下标变化速度要比有左边下标变化来的更快。要访问一个二维数组第i行第j列的元素,用以下表达式:

a[i][j]

C语言在表达式中将a当做是指向该数组第一行第一列中元素的指针。整个表达式等价于:

*(*(a+i)+j)



0 0
原创粉丝点击