C语言的二维数组、及多维数组的降维

来源:互联网 发布:ubuntu复制文件到win 编辑:程序博客网 时间:2024/06/06 05:41

    二维数组可以理解为一个二维表格,也类似于一个由指向行数组的指针构成的一维指针数组。因此,二维数组(包括高维)可以进行降维,最后变成一维数组。

    二维数组的定义形式:数据类型 标识符[ ] [ ]

    第一维一般称为“行”,第二维称为“列”。比如: float array[3][4]。

    二维数组的初始化。


    1. 将所有数据写在一个大括号内,如:

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

    数组逐行、逐列顺序地被赋予上述数值。


    2.分行赋值

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

    一行一个大括号,以此类推。这种方式最直观。如果写成以下形式,则更为直观:


int sqrs[5][2] = {    1,1,    2,4,    3,9,    4,16,    5,25};//初始化多维数组时,可以在每维初始化字符的前后加上花括号,这叫做“子集分组”int sqrs[5][2] = {    {1,1},    {2,4},    {3,9},    {4,16},    {5,25}};


    3.部分赋值。原则是从前往后优先赋值,后面没有赋值到的自动赋值为0。

    array[3][4]={{1,2},{8},{9,10}};

    这种赋值方式下,数组的元素分布情况为:

    1,2,0,0

    8,0,0,0

    9,10,0,0



下例将数值1-12装入一个3行4列的二维数组,然后将其按行打印出来。

#include <stdio.h>main(){int t,i,num[3][4];//用2个循环给二维数组num进行赋值for(t=0;t<3;++t)for(i=0;i<4;++i)num[t][i]=(t*4)+i+1;//用2个循环将二维数组的值逐项进行输出for(t=0;t<3;++t){for(i=0;i<4;++i)printf("%3d",num[t][i]);printf("\n");}}

运行结果:






    把二维数组作为函数的变元时,实际只传送指向数组第一个元素的指针。然而,在接收二维数组变元的函数中,至少应该定义第二维的长度,因为C编译程序必须了解每列的长度后才能正确地对数组进行下标操作。例如,接收10、10二维数组的函数必须定义成:

    void fun1(int x[][10])

    {

        /*......*/

    }

    编译程序必须了解第二维的准确长度,否则无法确定第二行从哪里开始。


    因为二维数组可以被看做由指向行数组的指针构成的一维指针数组,因此,使用指针变量是访问二维数组元素的简便方法。以下函数说明了这一技术,并为全局整形数组num的指定行输出内容:

int num[10][10]/* ... */void pr_row(int j){    int *p, t;    p=(int *)&num[j][0];    //获取j行第1个元素的地址    for(t=0;t<10;++t)        printf("%d",*(p+t));}

    通过产生调用变元为行号、行长和指向第一个元素的指针,可以把以上程序变成通用子程序:

void pr_row(int j,int row_dimension,int *p){    int t;    p=p+(j * row_dimension);    for(t=0;t<row_dimension;++t)        printf("%d",*(p+t));}/* ... */void f(void){    int num[10][10];    //打印出第一行    pr_row(0,10,(int *)num);}

    多于二维的数组也可以通过类似方法降维处理。例如,三维数组降成指向二维数组的指针,二维数组再进一步降成指向一维数组的指针。归纳之,n维数组可以降为一个指针和一个(n-1)维数组;新(n-1)维数组同样可降为一个指针和一个(n-2)维数组;以此类推,直到降成一维数组位置。