例如int a[5]是一维数组,他是由a[0]、a[1]、a[2]、a[3]、a[4]这五个int类型的数组组成的。
如果放到excel里面,那么就是:
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
这样一个样子,一维表示线。
一维数组的表示方法可以理解为:
变量名[横坐标x]
x初始为0,表示原点
假如表格从线到面,就升格为二维。
二维数组的的特点是既有横坐标,又有纵坐标。声明格式为:
int 变量名[纵坐标y][横坐标x]
表示每行有x个元素,每列有y行。
例如int a[3][4],放在表格里的表现形式为:
a[0][0] |
a[0][1] |
a[0][2] |
a[0][3] |
a[1][0] |
a[1][1] |
a[1][2] |
a[1][3] |
a[2][0] |
a[2][1] |
a[2][2] |
a[2][3] |
注意:之所以这么写,是因为在初始化的时候,先初始化第0行(实际上的第一行),再初始化第1行,再初始化第2行等。
二维数组可以这么理解;
先有数组a[x],然后这个数组里就有x个元素;
然后在数组a[x]的基础上,由y个a[x]数组组成的a[y][x]数组,于是就有a[y][x]——相当于是双重数组,第一个数组有4个成员,第二个数组有3个成员(且这3个成员每个都有4个成员);
假如分别初始化a[0]={}; 中括号里面的0,指的是y坐标,因此初始化的是第y+1行上的x坐标成员
例如将int a[3][4]进行初始化的代码如下:
//初始化二维数组 #include<iostream> int main() { using namespace std; double a[3][4] = { {0.0,0.1,0.2,0.3}, //第一行,注意,一行以大括号包围,大括号以逗号为结尾。 {1.0,1.1,1.2,1.3}, //之所以以逗号为结尾,是因为数组成员之间以逗号为间隔, {2.0,2.1,2.2,2.3}, //若将一个大括号内的4个元素整体看做一个大数组的成员,那么这个大数组有三个成员 }; cout << "a[0][0] = " << a[0][0] << endl; //输出大数组第一个成员中(第一行)的小数组第一个成员(第一列) cout << "a[0][1] = " << a[0][1] << endl; //输出大数组第一个成员中(第一行)的小数组第二个成员(第二列) cout << "a[1][0] = " << a[1][0] << endl; //第二行,第一列 cout << "a[2][3] = " << a[2][3] << endl; //第三行,第四列 system("pause"); return 0; }
输出:
a[0][0] = 0 a[0][1] = 0.1 a[1][0] = 1 a[2][3] = 2.3 请按任意键继续. . .
总结:
①我觉得可以将二维数组理解为一个excel表格,只不过excel表格的初始横纵坐标都是1,而二维数组的初始横纵坐标是0。
②坐标输出是先横行,再纵列——先横后竖。
③二维数组不仅支持int类型,也支持double类型,可以推断,也会支持char、string类型等。
代码:
//验证二维数组支持string类型 #include<iostream> #include<string> int main() { using namespace std; string a[3][4] = { {"八","一","六","上"}, {"三","五","七","中"}, {"四","九","二","下"}, }; cout << "a[0][0] = " << a[0][0] << endl; //输出大数组第一个成员中(第一行)的小数组第一个成员(第一列) cout << "a[0][1] = " << a[0][1] << endl; //输出大数组第一个成员中(第一行)的小数组第二个成员(第二列) cout << "a[1][0] = " << a[1][0] << endl; //第二行,第一列 cout << "a[2][3] = " << a[2][3] << endl; //第三行,第四列 system("pause"); return 0; }
输出:
a[0][0] = 八 a[0][1] = 一 a[1][0] = 三 a[2][3] = 下 请按任意键继续. . .
④因为有二维数组,可以推断也有三维数组,或许也有四维数组。
格式类似,即 类型名 变量名[z][y][x]。然后每一个数组初始化结束后,用大括号括起来。
代码:
//验证有三维数组 #include<iostream> #include<string> int main() { using namespace std; int a[2][3][4] = //a[z][y][x] { { //是z坐标第一面 {000,001,002,003}, //y坐标第一行中的x坐标第1~4个 {010,011,012,013}, //y坐标第二行 {020,021,022,023}, }, //以逗号结尾,因为可以把a[y][x]看成一个更大的数组中的一个成员 { //z坐标第二面 {100,101,102,103}, {110,111,112,113}, {120,121,122,123}, }, }; cout << "a[0][0][0] = " << a[0][0][0] << endl; //输出z=0,y=0,x=0——注:=0为第一行,依次类推 cout << "a[0][0][1] = " << a[0][0][1] << endl; //输出z=0,y=0,x=1 cout << "a[1][1][0] = " << a[1][1][0] << endl; //输出z=1,y=1,x=0 cout << "a[1][2][3] = " << a[1][2][3] << endl; //输出z=1,y=2,x=3 system("pause"); return 0; }
输出:
a[0][0][0] = 0 a[0][0][1] = 1 a[1][1][0] = 110 a[1][2][3] = 123 请按任意键继续. . .
⑤假如二维/三维数组的值是有规律的,例如跟三维坐标有关,于是可以利用for来给数组赋值:
代码:
#include<iostream> #include<string> int main() { using namespace std; int a[2][3][4]; //a[z][y][x] int x = 0, y = 0, z = 0; for (z = 0;z < 2;z++) { for (y = 0;y < 3;y++) { for (x = 0;x < 4;x++) { a[z][y][x] = z * 100 + y * 10 + x; } } } //逻辑是先判断z,然后判断y,然后判断x,这个时候,三个坐标都有确切数组了,于是根据算法,a[z][y][x]就有确切数值了 cout << "a[0][0][0] = " << a[0][0][0] << endl; //输出z=0,y=0,x=0——注:=0为第一行,依次类推 cout << "a[0][0][1] = " << a[0][0][1] << endl; //输出z=0,y=0,x=1 cout << "a[1][1][0] = " << a[1][1][0] << endl; //输出z=1,y=1,x=0 cout << "a[1][2][3] = " << a[1][2][3] << endl; //输出z=1,y=2,x=3 system("pause"); return 0; }
输出和未使用for的是一样的