C语言的二维数组、及多维数组的降维
二维数组可以理解为一个二维表格,也类似于一个由指向行数组的指针构成的一维指针数组。因此,二维数组(包括高维)可以进行降维,最后变成一维数组。
二维数组的定义形式:数据类型 标识符[ ] [ ]
第一维一般称为“行”,第二维称为“列”。比如: 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)维数组;以此类推,直到降成一维数组位置。
上一篇: 网络流入门习题
下一篇: 一、二维数组以及多维数组