多语言展示
当前在线:1937今日阅读:168今日分享:49

通过指针访问数组元素的各种方法

指针提供一种以符号形式使用地址的方法,因为它以更接近机器的方式表达,所以使用指针的程序更有效率。尤其是,指针能有效地处理数组。实际上,数组表示法其实是在变相地使用指针。在这篇经验中,我将以C语言为例展示指针访问数组元素的方法。
工具/原料
1

编辑器

2

编译器

3

电脑

方法/步骤
1

先从最基本的概念开始。&是地址运算符。当它后面是一个变量名时,&给出该变量的地址。*是间接或解引用运算符。当它后面是一个指针时,*给出储存在指针指向地址中的值。数组名是数组首元素的地址。也就是说,如果 flizny 是一个数组,下面的语句成立:flizny == &flizny[0]; 另外,需要注意C语言运算符的优先级。间接运算符(*)的优先级高于+,如果dates是个数组名,则* dates+2相当于( * dates)+2:* (dates + 2)       // dates 第 3 个元素的值* dates + 2         // dates 第 1 个元素的值加 2

2

先以这段程序为例。注意指针加上一个数时,它的值发生了什么变化(代码中的转换说明%p会以十六进制显示指针的值)。

3

这是它的输出。经过分析可以得出,我的电脑中,地址按字节编址,short类型占用2字节,double类型占用 8 字节。在C语言中,指针加1指的是增加一个存储单元。对数组而言,这意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址。

4

然后再提升难度,开始探讨多维数组。增加数组维数会增加指针的复杂度。以这段程序为例:

5

这是上面代码的运行结果。因为zippo和zippo[0]都开始于同一个地址,所以的值相同。结果显示出zippo[0]是一个占用一个int大小对象的地址,而 zippo 是一个占用两个int大小对象的地址。因为zippo[0]是该数组首元素(zippo[0][0])的地址,所以* (zippo[0])表示储存在zippo[0][0]上的值(即一个int类型的值)。与此类似,* zippo代表该数组首元素(zippo[0])的值,而zippo[0]是个地址。该值的地址是&zippo[0][0],即* zippo就是&zippo[0][0]。** zippo与* &zippo[0][0]等价,这相当于zippo[0][0]。简而言之,zippo是地址的地址,必须解引用两次才能获得原始值。

6

zippo:二维数组首元素的地址(每个元素都是内含两个int类型元素的一维数组)zippo+2:二维数组的第3个元素(即一维数组)的地址* (zippo+2):二维数组的第3个元素(即一维数组)的首元素(一个int类型的值)地址* (zippo+2) + 1:二维数组的第3个元素(即一维数组)的第2个元素(也是一个int类型的值)地址* ( * (zippo+2) + 1):二维数组的第3个一维数组元素的第2个int类型元素的值,即数组的第3行第2列的值(zippo[2][1])下图更直观地演示了数组地址、数组内容和指针之间的关系。

注意事项
1

注意运算优先级。

2

代码应当尽可能清晰易读。

推荐信息