一: 一般格式:
存储类别 类型说明符 数组名 [常量表达式1] [常量表达式2]
说明;类型说明符可以是任意数据类型或构造数据类型,数组名就是我们定义的标识符.
常量表达式1的值表示第一维元素的个数,也称为"数组的长度".常量表达式2的值就是第二维元素的个数。
例如:
static int a[4][3]; double b[4][3]; char c[3][4]; float c[4][3];
二:二维数组元素的表示形式:
一般表示形式:
数组名 [下标1] [下标2]
在知道其表示含义前,先介绍二维数组元素的存储我们打印a[3][4],它会输出任意值
#include<stdio.h> #define N 3 #define M 4 int main() { int i,j,arr[N][M]; for(i=0;i<N;i++) { for(j=0;j<M;j++) { printf("a[%d][%d]=%d\t\t",i,j); } } printf("\n"); }
计算机的存储器是连续偏址,也就是说存储单元按一维存储
那么,存储二维数组,我们采取,先存储完前一行再存储下一行。
我们就引入行列式(矩阵)例如:
我们定义一个数组 int a[3][4]
第一列
a[ ][0]
第二列
a[ ][1]
第三列
a[ ][2]
第四列
a[ ][3]
第一行a[0][ ] a[0][0] a[0][1] a[0][2] a[0][3] 第二行a[1][ ] a[1][0] a[1][1] a[1][2] a[1][3] 第三行a[2][ ] a[2][0] a[2][1] a[2][2] a[2][3] 每个元素占2个字节,共有12个元素,即占24个字节
我们就阵来看待可以用数学当中的矩二维数组的表示形式
"常量表达式一"代表行数,"常量表达式二"代表列数
数据放完第一行后,再存储在下一行定义 int a[2][3]
它的元素个数及表达为为:
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
a[2][0],a[2][1],a[2][2]
个数=常量表达式1*常量表达式2
三:初始化二维数组的不同形式
NO.1 将所有元素的初始值有次序的放在一个花括号内,并用逗号相隔开,如:static b[2][2]={1,2,3,4} //等价于: b[0][0]=1,b[0][1],b[1][0],b[1][1]
NO.2 每行的数据依次放在花括号内,再将各行的数据用逗号隔开放在最外层的花括号中,如:
static c[2][2]={{1,2},{3,4}} //等价于NO.1的1例子b[2][2]
这样更为直观,符合二维数组的特点NO.3 未赋值的元素自动取零或空字符(字符组),如;
static d[2][2]={{1},{2,3} //等价于: d[0][0]=1,d[0][1]=0 d[1][1]=2,d[1][2]=3
NO.4 若所有元素要赋值,第一维的长度可以不用给出,但第二位的长度要给出,如:
static e[ ][2]={1,2,3,4}
第二维的长度为2,即有2列数,共有4个初值,就可以得出有2行数
即等价于:e[0][0]=1,e[0][1]=2 e[1][0]=3,e[1][1]=4
三:引用二维数组元素
其一般格式:
数组名[下标][下标]
说明:下标的值是整数或整型表达式引用二维数组的常见错误:
NO.1
a[2-1][2*2-1]不能写成a[2,3]或a[2-1,2*2-1]
NO.2使用数组元素时应注意下标值在已定义的数组大小的范围内,如:
int a[2][2]; a[2][2]=1;//没有此元素
四:典例
一:将一个二维数组a的行和列的元素互换,保存到另一个二维数组b中
1 2 3 1 4
a=[ ] b=[2 5]
4 5 6 3 4分析:关键在于在循环语句中将b[j][i]的值赋值给a[i][j]
#include<stdio.h> int main() { int a[2][3]={{1,2,3},{4,5,6}};//按题目要求定义数组并赋值 int b[3][2],i,j; printf("array a\n"); for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("%5d",a[i][j]);//用两个循环语句输出a的数组 b[j][i]=a[i][j];//将a[i][j]的值赋值给b[j][i] } printf("\n"); } printf("array b:\n"); for(j=0;j<3;j++) { for(i=0;i<2;i++) printf("%5d",b[i][j]);//用两个循环语句输出题目要求的b数组 printf("\n"); } }
二:打印如下杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
分析:第一列和斜对角线的值都为1,如题,
可以看出i=2,j=1开始的值都符合此公式
a[i][j]=a[i-1][j-1]+a[i-1][j]#include<stdio.h> #define N 6 int main() { int a[N][N]={0}; int i=0,j=0; for(i=0;i<6;i++) { a[i][0]=1; a[i][i]=1;//定义数组且将第一列和斜对角线的元素都赋值为1 } for(i=2;i<N;i++) { for(j=1;j<i;j++) { a[i][j]=a[i-1][j-1]+a[i-1][j];//用两个for语句将i>=2,j>=1的元素用此公式赋值 } } for(i=0;i<N;i++) { for(j=0;j<=i;j++) { printf("%5d",a[i][j]);//用for语句输出题目要求的二维数组 } printf("\n"); } }