详解指针与多维数组

原创 Jianxiong2333  2018-04-19 20:02  阅读 620 次

指针和多维数组的关系

函数是通过指针来处理多维数组的(数组名本身也算一个指针),我们在使用这样的函数之前要先了解指针和多维数组的关系。假设有如下的声明:

  1. int test[2][2];/*一个整形二维数组*/

数组名 test 同时是数组的首元素的地址。那么我们要搞懂,多维数组的首元素和一维数组的首元素有什么不同。首先复习,一维数组中,数组名是首元素的地址,那么直接输出数组名地址存储的值,就等于输出了首元素的值,因为它和首元素是一个地址。那么在本例中,test 这个数组名是指向 test[0] 的,test 的首元素(test[0])本身又指向了 test[0][0] 所以,test 实际上是指向 test[0] 的地址,但 test[0] 存储的又是 test[0][0] 的地址,下面我们进一步分析:

数组名的关系

  • 因为 test 是数组首元素的地址,那么这个数组的首元素是 test[0], 所以 test 是指向了test[0] 的指针,而 test[0] 因为二维数组的关系,这就是存储的这个多维数组的第一个元素的地址的指针,那么这个指针将继续指向下去,直至指到多维数组的第一个元素,那么 test[0] 会继续指向 test[0][0] ,所以可以说,test 和 &test[0] 的值是相同的,都是指向一个地址。另一方面, test[0] 又包括了两个指针(数组),test[0] 到 test[0][0] ,还有自己本身的跨度。因此,test[0] 同其 test 的指向值与 &test[0][0] 的地址相同。简单来说,test[0] 只指向了 test[0][0] 这是一个数据大小的跨度,而 test 指向了 test[0] 和 test[0][0] 两个数据大小的跨度。但因为这个二维数组以及所存储的首元素都起始于一个地址,因此,test 和 test[0] 具有同样的值。

对地址加1

  • 同时,对一个指针(即地址)加 1,会对值加上一个对应数据大小的值。在此,test 和 test [0] 是不一样的,test 所指向的大小(跨度)是两个 int 而 test[0] 所以指向的大小(跨度)是一个 int 。因此 test 和 test[0] 加 1 的结果不同,一个是整体维度的跨越,一个是单个数据大小的跨越。

取值的差异

  • 对一个指针(即地址)取值(使用 * 取地址符或者带索引的 [] 运算符)得到的是该指针所指向对象的值(这可不会跨越取值,我们可以看到指向的过程)。因为 test[0] 是 test[0][0] 的地址,所以 *(test[0]) 取了 test[0] 这个指针所指地址存的值(即test[0][0]地址中所存储的地址中的值,即一个 int 整数) ,同样 *test 也是取出 test 指向的值,test 指向的是首元素 test[0],但是test[0] 本身是存储的 &test[0][0] (即地址),因此 *test 等同于 &test[0][0] ,如果想得到二维数组起始存储的元素值,那么就需要多次取值,比如 **test 等价于 *&test[0][0] ,从右往左看,第一个 * 号取出了 test[0] 中存储的 test[0][0] 的地址,第二个 * 号取出了前面所取出的地址的值,即取出了 test[0][0] 这个地址的值。简言之,test 是地址的地址(地址存储地址),需要两次取值才能拿到通常的值数值。地址的地址或指针的指针是双重间接(double indirection)的典型例子。

实际使用

  • 比如我们指向 test[1][1] (最后一个元素),我们可以用 **(test + 1) + 1 来表达,为了方便理解,我们加上优先级括号,逐步解析。*(*(test + 1) + 1),先看里面的括号,test + 1 表示进行了整体维度的跨越,然后我们用 * 号取出地址值,再向这个地址 + 1 数据大小,然后把得到的地址,再取出来,用了两个取值。这里使用数组取值,意图不是可以替换更加简洁的 test[1][1] 表达式,而是说明,当你有一组二维数组的时候,使用数组符号要比指针符号更加简单。
本文地址:http://www.gouliguo.com/zhizhenyuduoweishuzu/
版权声明:本文为原创文章,版权归 Jianxiong2333 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

  1. 老鹰主机
    老鹰主机 【农民】 @回复

    朋友 交换链接吗

  2. boke112导航
    boke112导航 【农民】 @回复

    博主,你好,boke112导航特来拜会,已将贵站收录到博客目录的综合资讯类,谢谢支持!

  3. 雷奥技术网
    雷奥技术网 【农民】 @回复

    老铁换链吗? http://www.rell.vip

  4. 钟水洲
    钟水洲 【农民】 @回复

    本站已开通投稿,欢迎博主支持!(采纳后提供版权保护,开通作者专栏)