二维数组的定义和引用
1.定义:类型说明符 数组名 【常量表达式】【常量表达式】
int a[3][[4](元素类型,数组名,行数,列数)
(1)其行列的序号均从0开始,数组元素是以行序顺序存放的,在内存中,多维数组依然是直线顺序排放的,第一个元素位于最低地址处。
假设:int a[M][N];且数组首地址为Adress0,那么a[i][j]的地址?
Adress0+(i*N+j)*sizeof(int)
可以知道根据下标计算某个元素的地址,必须知道该数组的列数,即N。
2.引用:与一维数组一样,二维数组必须先定义,其维数必须是常量,具体引用时(赋值,运算,输出)每个元素等同于一个变量。
#include<iostream>
using namespace std;
int main()
{
int i,j;
int a[3][4];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cin>>a[i][j];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cout<<a[i][j];
return 0;
}
二维数组的初始化
在定义数组的同时给数组元素赋值。
1.顺序赋值
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
2.分行赋值
int a[3][4]={{,2,3,4},{5,6,7,8},{9,10,11,12}};
3.部分赋值
int a[3][4]={{1},{5},{9}]; //a[0][0]=1;a[1][0]=5;a[2][0]=9;其余元素都为0;
inta[3][4]={{1,2},{3}}; //a[0][0]=1;a[0][1]=2;a[1][0]=3;其余元素为0;
4.分行或全部赋值时,可以省略第一维,不可以省略第二维。
int a[][4];
5不能给数组整体赋值,只能一个一个赋值。
int a[3][4]; //数组名代表数组首地址。
a={1,2,3,4,5,6}; ❌
a[3][4]={1,2,3,4,5,6}; ❌
6.用static或者是全局定义的数组如果不赋初值,系统均默认为0.
7.二维数组可以看成是特殊的一维数组:它的元素可以看成是一个一个的一维数组。
例如:int a[3][4];可以看成3个一维数组int a[0],int a[1],int a[2],每个一维数组中又有4个元素。
二维数组基本应用
假设创建如下的二维数组int a[3][4];
使用输入值初始化数组
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cin>>a[i][j];
return 0;
}
显示数组中的每个元素
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cout<<a[i][j];
return 0;
}
对所有元素求和
{
int i,j,sum=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
sum+=a[i][j];
return 0;
}
对数组按列求和
for (i = 0; i < 3; i++) {
sum = 0;
for (j = 0; j < 4; j++)
sum += a[i][j];
cout << "第" << i << "列的和为" << sum;
}
找出数组中最大的数
int max = a[0][0];
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++) {
if (max < a[i][j])
max=a[i][j];
}
cout << "最大值为" << max;
将数组行列互换
{
int i, j,t=0;
int a[3][3] = {1,2,3,4,5,6,7,8,9};
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++)
cout << a[i][j];
cout << endl;
}
for (i = 0; i < 3; i++) {
for (j = 0; j < i; j++) {
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++)
cout << a[i][j];
cout << endl;
}
return 0;
}
1 2 3 1 4 7
4 5 6 2 5 8
7 8 9 3 6 9
将一个二行三列的二维数组转存到一个一维数组中
{
int i, j, k = 0;
int b[6];
int a[2][3] = { 1,2,3,4,5,6 };
for(i=0;i<2;i++)
for (j = 0; j < 3; j++) {
b[k] = a[i][j];
k++;
}
for (k = 0; k< 6; k++)
cout << b[k];
return 0;
}
用数组做函数参数
1.用数组元素做函数参数,用法与一般变量作参数完全一样,是“值传递”。
例子:假设有2个已知的数组a和b,然后要求c中数组是a和b中对应数的最大公约数。
#include<iostream>
using namespace std;
int gys(int n,int m) {
int t = 1, q = 2;
while (n>=q&&m>=q) {
if (n % q == 0 && m % q == 0)
t = q;
q++;
}
return t;
}
int main()
{
int a[3] = { 26,42,12 }; int b[3] = { 15,12,9 };
int c[3];
for (int i = 0; i < 3; i++) {
c[i] = gys(a[i], b[i]);
cout << c[i]<<'\t';
}
cout << endl;
return 0;
}
2.用数组名做函数的参数(重点)
(1)在C++中,数组名是数组在内存中存放的首地址。
(2)用数组名做函数参数,实参和形参都要用数组名。
(3)这时,函数传递的是数组在内存中的首地址。
(4)实参中的数组地址传到形参中,实参和形参共用同一段内存。
例子:将数组内各元素加倍输出
#include<iostream>
using namespace std;
int jp(int a[2]) {
for (int i = 0; i < 2; i++)
a[i] = a[i] * a[i];
return 0;
}
int main() {
int b[2] = { 2,4 };
cout << b[0] << '\t' << b[1] << endl;
jp(b);
cout << b[0] << '\t' << b[1] << endl;
return 0;
}
一维形参数组大小可不指定。
例子:将数组内元素排顺序。
int pdx(int x[]) {
int i, j,t;
for (i = 0; i < 5; i++)
for (j = 0; j < 4 - i; j++)
if (x[j] > x[j + 1]) {
t = x[j];
x[j] = x[j + 1];
x[j + 1] = t;
}
return 0;
}
int main() {
int q[5] = { 5,1,6,4,7 };
for (int i = 0; i < 5; i++)
cout << q[i] << '\t';
return 0;
}
3.用多维数组名做函数参数
(1)同样的,实参向形参传递的是数组首地址。
(2)如果,实参和形参是二维数组,则形参可以省略第一维,不能省略第二维,且第二维必须与实参中的维度相同。
实参 int a[3][8]
形参 int a[][8] √ int a[2][8] √
int a[][6] ×(二维不一致) int a[][] × (二维不可以是空)
例子:有一个3*4的矩阵,求其中的最大元素。
int qzd(int p[3][4]) {
int i, j,max;
max = p[0][0];
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++)
if (p[i][j] > max)
max = p[i][j];
}
return max;
}
int main() {
int n[3][4] = { {1,2,35,4},{4,5,69,8}, {0,5,1} };
cout<<qzd(n)<<endl;
return 0;
}
注意:(1)用数组名做函数参数,应将主调函数和被调函数中分别定义数组,且类型一致。
(2)一维形参数组的大小可不指定;二维形参数组的第一维可不指定,但第二维必须指定,且与实参一致。
(3)数组名做实参实际上是传递数组的首地址。
(4)在C++语言规定,数组名代表数组在内存中存储的首地址,这样,数组名做函数实参,实际上传递的是数组在内存的首地址。实参和形参共占一段内存单元,形参数组中的值发生变化,也相当于实参数组中的值发生变化。
(5)C++语言对数组边界不进行检查,在使用中要引起注意。
比如:int a[3];程序中出现a[11]; 合法!
int a[3][4];程序中出现a[4][6]; 合法!
例子:只能排5个,不通用。
int pdx(int x[]) {
int i, j,t;
for (i = 0; i < 5; i++)
for (j = 0; j < 5- i-1; j++)
if (x[j] > x[j + 1]) {
t = x[j];
x[j] = x[j + 1];
x[j + 1] = t;
}
return 0;
}
改进:能排序任意数量的数,通用。
int pdx(int x[],int n) {
int i, j,t;
for (i = 0; i < n; i++)
for (j = 0; j < n - i-1; j++)
if (x[j] > x[j + 1]) {
t = x[j];
x[j] = x[j + 1];
x[j + 1] = t;
}
return 0;
}