C++ 二维数组创建&&二维数组作为函数返回值&&二维数组作为形参

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;
}

运行结果
《C++ 二维数组创建&&二维数组作为函数返回值&&二维数组作为形参》

② 利用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;
}

运行结果:
《C++ 二维数组创建&&二维数组作为函数返回值&&二维数组作为形参》
不熟悉指针可以看这个:用的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++二维数组总结
传统数组内存空间:
《C++ 二维数组创建&&二维数组作为函数返回值&&二维数组作为形参》
指针数组内存空间:
《C++ 二维数组创建&&二维数组作为函数返回值&&二维数组作为形参》
仓促成文,不当之处,还请指教,欢迎讨论

    原文作者:xwz2244
    原文地址: https://blog.csdn.net/bi_an_never/article/details/123411761
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞