二维数组类同于数学中的行列矩阵,第一维表示行,第二维表示列。对象与对象一类的问题大都可以抽象为二维数组来描述。
二维数组定义
数据类型 数组名[第一维大小][第二维大小];
int a[4][5];
float sc[3][4];
定义动态二维数组:
int n=2;
int a[n][3];
int b[2][n];
定义的数组未初始化时,数组内存储的时随机数;
int a[2][3];//该数组的六个元素为随机数
如果把二维数组看成特殊的一维数组,他每个元素就是特殊的一维数组。
int salary[3][4];
这是一个三行四列的二维数组,可以用该数组表示三个对象,所以将该数组看成三个一维数组,
三个对象分别是salary[0]、salary[1]、salary[2]
salary是数组名。
每个对象又是包含四个属性的一维数组,四个属性分别用
salary[i][0]、 salary[i][1]、salary[i][2]、salary[i][3];来表示。
二维数组名salary是salary[0]的地址,即salary=&salary[0]。
数组名+1表示跳过一个对象。
salary+1为第二个对象salary[1] 的地址,salary+2为第三个对象salary[2] 的地址。
PS.从数学行列式角度分析,二维数组名,即首行的地址,C语言中的地址一般是空间首地址。故二维数组名是首行首地址,该数组名+1,表示跳过一整行,达到第二行的首地址,并以此类推。
//写个程序验证一下子
#include<stdio.h>
int main()
{
int sc[3][4];
printf("sc=%p\n",sc);
printf("&sc[0]=%p\n",&sc[0]);
printf("&sc+1=%p\n",sc+1);
printf("&sc+2=%p\n",sc+2);
return 0;
}
输出:
sc=000000000062FDF0
&sc[0]=000000000062FDF0
&sc+1=000000000062FE00
&sc+2=000000000062FE10
分析:
1)定义了一个三行四列的二维数组,三个对象,每个对象有四个属性;
2)二维数组名相当于首对象sc[0]的地址,即sc==&sc[0]。
输出的格式控制符为%p或%x或者%08x;
可以看到二维数组的首对象的地址是16进制数00062FDF0
3)二位数组名+1表示跳过一个对象(一行)的空间,到下一个对象(行) 的地址。即跳过一个对象的所有属性的空间,到下一个对象的起始位置。
例子中int型数组在devc++的每个属性占用四个字节,一个对象占用4*4=16个字节,故sc、sc+1、sc+2的地址相差16个字节。
4)程序每次运行时,由于起始地址的分配不同,所以输出结果会有不同。
二维数组的引用
二维数组的引用格式:
数组名[行下标][列下标];
注意:行下标和列下标均从0开始,同时要注意防止越界。
加个例子说一下:
#include<stdio.h>
int main (void)
{
int a[2][3]; //先定义,后赋值
int i,j,s=0;
printf("Input 6 integers:");
for(i=0;i<2;i++) //行下标
{
for (j=0; j<3; j++) //列下标
{
scanf ("%d",&a[i][j]); //勿忘 &
s+=a[i][j] ; //与上一条语句不能颠倒
}
}
for(i=0;i<2;i++)
{
for (j=0; j<3; j++)
printf("%d\t",a[i][j]); //使用\t 的作用:向后跳四个空格,常用来做格线对齐
printf ("\n"); //注意该输出换行符的位置
}
printf("s=%d\n", s);
return 0;
}
运行结果:
Input 6 integers:1 2 3 4 5 6
1 2 3
4 5 6
s=21
二维数组的存储
二维数组在逻辑(逻辑)表现形式上可以理解为矩阵(分行分列),但是在内存中的物理存储又是连续的,即存完第一行,在后面继续存储第二行,第三行,…
动态二维数组的应用举例
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int line,list;
int **pary;
int i,j;
printf("Input the line:\n");
scanf("%d",&line);
printf("Input the list:\n");
scanf("%d",&list);
pary = (int **)malloc(sizeof(int *)*line);
printf("Input the array:\n");
for(i=0;i<line;i++)
{
pary[i] = (int *)malloc(sizeof(int)*list);
for(j=0;j<list;j++)
{
scanf("%d",&pary[i][j]);
}
}
for(i=0;i<line;i++)
{
for(j=0;j<list;j++)
{
printf("%d ",pary[i][j]);
}
printf("\n");
}
for(i=0;i<line;i++)
free(pary[i]);
free(pary);
return 0;
}