C语言如何实现⼆级指针对⼆维数组的操作?

一、问题

        如何操作⼆维数组?

二、解笞

        要更清楚地了解⼆维数组的指针,⾸先要掌握⼆维数组数据结构的特性。⼆维数组可以看成是元素值为⼀维数组的数组。假设有⼀个 3 ⾏ 4 列的⼆维数组a,它定义为:

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

        a 是数组名。a 数组包含3⾏,即 3 个元素:即 a[0]、a[1]、a[2]。⽽每个元素又是⼀个包含4 个元素的⼀维数组。同⼀维数组⼀样,a 的值为数组⾸元素地址值,⽽这⾥的⾸元素为 4 个元素组成的⼀维数组。

        因此,从⼆维数组角度看,a 代表的是⾸⾏的⾸地址。 a+1 代表的是第⼀⾏的⾸地址。a[0]+0 可以表示为 &a[0][0],即⾸⾏⾸元素地址;a[0]+1 可以表示为 &a[0][1] ,即⾸⾏第⼆个元素的地址。

        使⽤指针指向数组时,在⼀维数组中 a[0] 与 *a[o] 等价,a[1] 与 *a(+1) 等价。因此,在⼆维数组中 a[0]+1 和 *(a+0)+1 的值都是&a[0][1],如下图中地址1002,a[1]+2 和 *(a+1)+2 的值都是 &a[1][2],如下图中的地址1012。

         下⾯再来看⼀个实例程序。

#include <stdio.h>
int main()
{
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    printf("%d,%d\n", a, *a);
    printf("%d,%d\n", a[0], *(a + 0));
    printf("%d,%d\n", &a[0], &a[0][0]);
    printf("%d,%d\n", a[1], a + 1);
    printf("%d,%d\n", &a[1][0], *(a + 1) + 0);
    printf("%d,%d\n", a[1][1], *(*(a + 1) + 1));
    return 0;
}

三、总结

        上⾯实例程序中给出了对⼆维数组的基本操作,那么我们可以根据这些基本操作的组合作出更⾼级的操作。

上一篇:分布式存储 Ceph 的演进经验


下一篇:C#算法之希尔排序