二维数组动态开辟与传参

    这里简单介绍动态二维数组的开辟与释放,以及二维数组传参的几种方法

动态二维数组的开辟与释放

     方法1:直接开辟一维数组
                eg:   int *p = new int[10*10];//当成一维数组进行开辟 
                访问数据的方式 :通过a[i*10+j] 来访问第(i*10+j)个数据。
                优缺点:访问数据很方便,且new的次数少,释放空间容易,但是不便于理解,且使用时需要转化。
void Test()
{
	int *p = new int[10*10];//直接开辟一维数组
	//初始化
	for(size_t i=0; i<10; i++)
	{
		for(size_t j=0; j<10; j++)
		{
			p[i*10+j] = i*j;  //通过a[i*10+j]来访问第(i*10+j)个数据
		}
	}
	//访问数据
	for(size_t i=0; i<10; i++)
	{
		for(size_t j=0; j<10; j++)
		{
			cout<<p[i*10+j]<<" ";  //通过a[i*10+j]来访问第(i*10+j)个数据
		}
		cout<<endl;
	}

	delete[] p; //释放
}
 方法2:一维指针数组。(指针数组+一维指针)
  eg:   int** maze = new int*[M];
                       for(int i=0; i<M; i++)
                       {
                            maze[i] = new int[N];
                       }  
               访问数据的方式:直接通过a[i][j]访问第i行第j列的数据。
               优缺点:通过a[i][j]访问数据容易,但new的次数太多释放空间不容易。
void Test()
{
	//开辟空间
	int ** p = new int*[10];
	for(size_t i=0; i<10; i++)
	{
		p[i] = new int[10];
	}

	//访问通过p[i][j]访问
	for(size_t i=0; i<10; i++)
	{
		for(size_t j=0; j<10; j++)
		{
			p[i][j] = i*j;
			cout<<p[i][j]<<" ";
		}
		cout<<endl;
	}
	//释放
	for(size_t i=0; i<10; i++)
	{
		delete[] p[i];
	}
	delete[] p;
}
 二维数组的传参方法
       方法1:形参为二维数组并给定第二维的长度  
                    形参: maze[][5] ----- 实参: maze
void InitAPrint(int p[][10]) //形参辟[][10]
{
	//访问通过p[i][j]访问
	for(size_t i=0; i<10; i++)
	{
		for(size_t j=0; j<10; j++)
		{
			p[i][j] = i*j;
			cout<<p[i][j]<<" ";
		}
		cout<<endl;
	}
}

void Test()
{
	int arr[10][10];

	InitAPrint(arr); //实参arr
}

     方法2: 形参为指向数组的指针并给出数组的长度  
                形参:(*maze)[5] ----  实参:maze           
void InitAPrint(int(*p)[10]) //形参辟(*)p[10]
{
	//访问通过p[i][j]访问
	for(size_t i=0; i<10; i++)
	{
		for(size_t j=0; j<10; j++)
		{
			p[i][j] = i*j;
			cout<<p[i][j]<<" ";
		}
		cout<<endl;
	}
}

void Test()
{
	int arr[10][10];

	InitAPrint(arr); //实参arr
}

这里仅列出两种传参方法,更多方法详见:https://blog.youkuaiyun.com/gqb_driver/article/details/8886687       








  

    

           

在Linux中,二维数组可以使用双重指针进行传参。 首先,定义一个函数来接收二维数组作为参数。函数的参数应该是一个指向指针的指针,例如: ``` void print_array(int **arr, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } ``` 在这个函数中,我们可以使用两个for循环来遍历整个数组,并打印出每个元素的值。 现在,我们需要在主函数中定义一个二维数组,并将其传递给上面定义的函数。定义数组和调用函数的代码如下所示: ``` int main() { int rows = 3; int cols = 4; int **arr = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { arr[i] = (int *)malloc(cols * sizeof(int)); for (int j = 0; j < cols; j++) { arr[i][j] = i * cols + j; } } print_array(arr, rows, cols); return 0; } ``` 在这个示例中,我们首先使用malloc函数来为数组分配内存空间,并使用两个for循环来初始化数组的每个元素。然后,我们调用了print_array函数,并将数组、行数和列数作为参数传递给它。 需要注意的是,我们在使用malloc函数为数组分配内存空间时,首先分配了一维数组的空间,然后再为每个一维数组分配空间。这是因为二维数组实际上是由若干个一维数组组成的,因此我们需要先为一维数组分配空间,然后再将它们组合成二维数组。 最后,记得在程序结束时释放数组占用的内存空间,以避免内存泄漏。可以使用两个for循环来释放每个一维数组的空间,然后再释放二维数组的空间,示例代码如下所示: ``` for (int i = 0; i < rows; i++) { free(arr[i]); } free(arr); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值