1. 二维数组常用创建方法
静态二维数组
① 确定行和列
a. 不确定元素
int a[2][2];
b. 部分元素确定
int a[2][3] ={1,2,3,4};
c. 确定元素
int a1[2][2] = {{1,2,}{3,4}};//标准的二维数组初始化方式
//在写明列号时{1,2,3,4}也可
②不指明行,指明列
//a. 经典写法:
int array[][3];
//b. 利用指针:
int (*array)[3];
动态二维数组
① 利用指针创建
//c++使用new申请空间,
//c使用 int **array = (int **)malloc(rows*sizeof(int *))
int** a2 = new int*[rows]; //a2[rows][columns]
//此时一个指针指向一个指针数组
for(int i=0;i<rows;i++)
a2[i] = new int[columns];
//指针数组a2每一个(指针)元素指向一个数组
for(int i=0;i<rows;i++){
for(int j=0;j<columns;j++){
a2[i][j]= i * columns + j;//初始化数组元素
cout << a2[i][j];
}
}
//释放空间
for(int i=0;i<rows;i++)
delete []a2[i];
//先撤销指针元素指向的数组
delete []a2;
//再撤销指针数组
创建2*3的数组并初始化:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int rows,columns;
cin >> rows >> columns;
//申请空间
int** a2 = new int*[rows];
//此时一个指针指向一个指针数组
for(int i=0;i<rows;i++)
a2[i] = new int[columns];
//指针数组a2每一个(指针)元素指向一个数组
for(int i=0;i<rows;i++){
for(int j=0;j<columns;j++){
a2[i][j]= i * columns + j;//初始化数组元素
cout << a2[i][j] << " ";
}
cout << endl;
}
//释放空间
for(int i=0;i<rows;i++)
delete []a2[i];
//先撤销指针元素指向的数组
delete []a2;
//再撤销指针数组
return 0;
}
运行结果
② 利用vetor创建二维数组
参考:vetor创建二维数组
二维数组创建完毕 接下来看作为**“返回值”以及函数形式参数**的情况
2. 二维数组作为函数返回值类型
C++规定:数组的空间是在运行前分配的。
因此二维数组长度理论上为定值,是不能修改的,因此无法直接将二维数组作为返回值类型,但可以使用结构体或者指针来完成相似的功能。
结构体
思路:定义一个结构体,结构体里面放一个数组,但这样做的缺陷数组大小需要固定,没办法根据输入动态产生一个指定大小的结构体。
struct dis{
int num[rows][columns];//rows,columns均需要先给定
};
指针
① 动态创建存放矩阵相乘结果的二维数组 d
a. 开辟大小为 m 的 int 型指针数组空间
int **d = (int **)malloc(m*sizeof(int *));
b. 再为每一个指针元素开辟大小为 n的 int 型数组空间
for ( int i = 0;i < m;i++){
d[i] = (int *)malloc(p*sizeof(int));
}
c. 用完释放二维数组空间
//释放空间
for(int i=0;i<m;i++)
delete []d[i];
//先撤销指针元素指向的数组
delete []d;
//再撤销指针数组
② 给二维数组赋值
③ return d;
完整代码:
/*
矩阵相乘 A[m][n]*B[n][p] 输出result[m][p]
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
int **determinantMutiply(int M,int N,int P){
cout << "请输入矩阵A的各个元素:" << endl;
int A[M][N] = {0};
for(int i = 0; i < M;i++){
for (int j = 0;j < N;j++){
cout << "A[" << i << "][" << j << "]=";
cin >> A[i][j];
}
}
cout << "请输入矩阵B的各个元素:" << endl;
int B[N][P] = {0};
for(int i = 0; i < N;i++){
for (int j = 0;j < P;j++){
cout << "B[" << i << "][" << j << "]=";
cin >> B[i][j];
}
}
int **d = (int **)malloc(M*sizeof(int *));
for ( int i = 0;i < M;i++){
d[i] = (int *)malloc(P*sizeof(int));
}
int C[M][P];
for (int i = 0;i < M;i++){
for (int j = 0;j < P;j++){
C[i][j] = 0;
for(int k = 0; k < N;k++)
C[i][j] += A[i][k] * B[k][j];
d[i][j] = C[i][j];
}
}
return d;
//释放空间
for(int i=0;i<M;i++)
delete []d[i];
//先撤销指针元素指向的数组
delete []d;
//再撤销指针数组
}
int main(int argc, char** argv) {
int M,N,P;
cout << "请输入矩阵A的维数(M,N):" << endl ;
cout << "M = ";
cin >> M;
cout << "N = ";
cin >> N;
cout << "请输入矩阵B的维数(N,P):" << endl ;
cout << "P = ";
cin >> P;
int **result = (int **)malloc(M * sizeof(int *));
for (int i = 0; i < M; i++)
{
result[i] = (int *)malloc(P * sizeof(int));
}
result = determinantMutiply(M,N,P);
cout << "A * B的结果是" << endl;
for(int i = 0;i < M;i++){
for (int j = 0;j < P;j++){
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}
运行结果:
不熟悉指针可以看这个:用的vectorC++ 函数返回二维数组
3.二维数组作为形式参数
int **array;
int n;
cin >> n;
array = new int *[n];
for(i = 0; i <n; i++)
array[i] = new int[n];
函数声明:void fuc(int **a);
函数调用:fuc(array);
在函数fuc中, a是指针的指针。
使用array[i * j + j]形式来访问数组中元素。
//这是由传统数组与指针数组分配空间不同的方式而决定的
两种内存空间详细说明C/C++二维数组总结
传统数组内存空间:
指针数组内存空间:
仓促成文,不当之处,还请指教,欢迎讨论😀