zoukankan      html  css  js  c++  java
  • 指向二维数组的指针

    指向二维数组的指针

    一. 二维数组元素的地址
        为了说明问题, 我们定义以下二维数组:
         int a[3][4]={{0,1,2,3}, {4,5,6,7}, {8,9,10,11}};
    a为二维数组名, 此数组有3行4列, 共12个元素。但也可这样来理解,数组a由三个元素组成: a[0], a[1], a[2]。而它中每个元素又是一个一维数组, 且都含有4个元素 (相当于4列), 例如, a[0]所代表的一维数组所包含的 4 个元素为 a[0][0], a[0][1], a[0][2], a[0][3]。如图5.所示:
            ┏━━━━┓    ┏━┳━┳━┳━┓
    a─┃ a[0] ┃─→       ┃ 0 ┃1 ┃ 2 ┃  3┃
            ┣━━━━┫    ┣━╋━╋━╋━┫
            ┃ a[1]   ┃─→  ┃4  ┃  5┃6 ┃ 7 ┃
            ┣━━━━┫    ┣━╋━╋━╋━┫
            ┃ a[2] ┃─→    ┃ 8 ┃9  ┃10┃11┃
            ┗━━━━┛    ┗━┻━┻━┻━┛
                       图5.
        但从二维数组的角度来看,a代表二维数组的首地址, 当然也可看成是二维数组第0行的首地址。a+1就代表第1行的首地址, a+2就代表第2行的首地址。 如果此二维数组的首地址为1000, 由于第0行有4个整型元素, 所以a+1为1016, a+2 也就为1032。如图6.所示
                               a[3][4]
                      a    ┏━┳━┳━┳━┓
         (1000)─→┃0 ┃1 ┃2┃3 ┃
                     a+1┣━╋━╋━╋━┫
          (1016)─→┃4 ┃5 ┃6┃7 ┃
                      a+2┣━╋━╋━╋━┫
          (1032)─→┃8 ┃9 ┃10┃11┃
                           ┗━┻━┻━┻━┛
                                 图6.
        既然我们把a[0], a[1], a[2]看成是一维数组名, 可以认为它们分别代表它们所对应的数组的首地址, 也就是讲, a[0]代表第 0行中第 0列元素的地址, 即&a[0][0], a[1]是第1行中第0列元素的地址, 即&a[1][0], 根据地址运算规则,a[0]+1即代表第0行第1列元素的地址, 即&a[0][1],一般而言, a[i]+j即代表第 i行第j列元素的地址,&a[i][j]
        另外, 在二维数组中, 我们还可用指针的形式来表示各元素的地址。如前所述, a[0]与*(a+0)等价, a[1]与*(a+1)等价, 因此a[i]+j就与*(a+i)+j等价,它表示数组元素a[i][j]的地址
        因此, 二维数组元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j), 它们都与a[i][j]等价, 或者还可写成(*(a+i))[j]
        另外, 要补充说明一下, 如果你编写一个程序输出打印a和*a,你可发现它们的值是相同的, 这是为什么呢?我们可这样来理解: 首先, 为了说明问题, 我们把二维数组人为地看成由三个数组元素a[0], a[1], a[2]组成, 将a[0], a[1], a[2]看成是数组名它们又分别是由4个元素组成的一维数组。因此,a表示数组第 0行的地址,*a即为a[0],它是数组名,当然还是地址,它就是数组第0行第0
    列元素的地址

        二. 指向一个由n个元素所组成的数组指针
        在VC6.0中, 可定义如下的指针变量:
          int (*p)[3];
        指针p为指向一个由3个元素所组成的整型数组指针。在定义中, 圆括号是不能少的, 否则它是指针数组, 这将在后面介绍。这种数组的指针不同于前面介绍的整型指针, 当整型指针指向一个整型数组的元素时, 进行指针(地址)加1运算, 表示指向数组的下一个元素, 此时地址值增加了4(因为放大因子为4), 而如上所定义的指向一个由3个元素组成的数组指针, 进行地址加1运算时, 其地址值增加了12(放大因子为4x3=12), 这种数组指针在VC6.0中用得较少, 但在处理二维数组时, 还是很方便的。例如:
              int a[3][4], (*p)[4];
             p=a;
        开始时p指向二维数组第0行, 当进行p+1运算时, 根据地址运算规则, 此时放大因子为4x4=16, (&a是“行”级别的
    )所以此时正好指向二维数组的第1行。

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    	int (*b)[4];
    	b = a;
    	for(int i = 0; i < 3; i++)
    	{
    		for(int j = 0; j < 4; j++)
    		{
    			cout << *(*(b+i)+j) << endl;
    		}
    	}
    	return 0;
    }



  • 相关阅读:
    Checking Types Against the Real World in TypeScript
    nexus pip proxy config
    go.rice 强大灵活的golang 静态资源嵌入包
    几个golang 静态资源嵌入包
    rpm 子包创建学习
    Rpm Creating Subpackages
    ava 类似jest snapshot 功能试用
    ava js 测试框架基本试用
    The Architectural Principles Behind Vrbo’s GraphQL Implementation
    graphql-compose graphql schema 生成工具集
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835171.html
Copyright © 2011-2022 走看看