C/C++ - 动态数组

一、C++二维数组 - 动态分配、释放

1、第一维、第二维均未知

#include <iostream>
#include <memory.h>
using namespace std;

int main()
{
	int rows, cols;
	cout << "请输入二维数组行数:";
	cin >> rows;
	cout << "请输入二维数组列数:";
	cin >> cols;

	// 分配
	int** a = new int* [rows];
	for (int i = 0; i < rows; i++)
	{
		a[i] = new int [cols];
	}
	
	// 置零
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}
	
	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	// 释放
	for (int i = 0; i < rows; i++)
	{
		delete [] a[i];
	}
	delete [] a;

	return 0;
}

2、第一维已知

#include <iostream>
#include <memory.h>
using namespace std;

const int rows = 3;

int main()
{
	int cols;
	cout << "请输入二维数组列数:";
	cin >> cols;

	// 分配
	int* a[rows];
	for (int i = 0; i < rows; i++)
	{
		a[i] = new int[cols];
	}

	// 置零
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}

	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	// 释放
	for (int i = 0; i < rows; i++)
	{
		delete [] a[i];
	}

	return 0;
}

3、第一维已知(内存连续)

#include <iostream>
#include <memory.h>
using namespace std;

const int rows = 3;

int main()
{
	int cols;
	cout << "请输入二维数组列数:";
	cin >> cols;

	// 分配
	int* a[rows];
	a[0] = new int [rows * cols];
	for (int i = 1; i < rows; i++)
	{
		a[i] = a[i - 1] + cols;
	}

	// 置零
	/*
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}*/
	memset(a[0], 0, rows * cols * sizeof(int)); // 内存连续

	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	// 释放
	delete [] a[0];

	return 0;
}

4、第二维已知(内存连续)

#include <iostream>
#include <memory.h>
using namespace std;

const int cols = 9;

int main()
{
	int rows;
	cout << "请输入二维数组行数:";
	cin >> rows;

	// 分配
	int (*a)[cols];
	a = new int [rows][cols];

	// 置零
	/*
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}*/
	memset(a, 0, rows * cols * sizeof(int)); // 内存连续

	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	// 释放
	delete [] a;

	return 0;
}

二、C二维数组 - 动态分配、释放

1、第一维、第二维均未知

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main()
{
	int rows, cols;
	printf("请输入二维数组行数:");
	scanf("%d", &rows);
	//scanf_s("%d", &rows, sizeof(rows));
	printf("请输入二维数组列数:");
	scanf("%d", &cols);
	//scanf_s("%d", &cols, sizeof(cols));

	// 分配
	int** a = (int**)malloc(rows * sizeof(int*));
	for (int i = 0; i < rows; i++)
	{
		a[i] = (int*)malloc(cols);
	}

	// 置零
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}

	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}

	// 释放
	for (int i = 0; i < rows; i++)
	{
		free(a[i]);
	}
	free(a);

	return 0;
}

2、第一维已知

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

const int rows = 3;

int main()
{
	int cols;
	printf("请输入二维数组列数:");
	scanf("%d", &cols);
	//scanf_s("%d", &cols, sizeof(cols));

	// 分配
	int* a[rows];
	for (int i = 0; i < rows; i++)
	{
		a[i] = (int*)malloc(cols * sizeof(int));
	}

	// 置零
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}

	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}

	// 释放
	for (int i = 0; i < rows; i++)
	{
		free(a[i]);
	}

	return 0;
}

3、第一维已知(内存连续)

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

const int rows = 3;

int main()
{
	int cols;
	printf("请输入二维数组列数:");
	scanf("%d", &cols);
	//scanf_s("%d", &cols, sizeof(cols));

	// 分配
	int* a[rows];
	a[0] = (int*)malloc(rows * cols * sizeof(int));
	for (int i = 1; i < rows; i++)
	{
		a[i] = a[i - 1] + cols;
	}

	// 置零
	/*
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}*/
	memset(a[0], 0, rows * cols * sizeof(int)); // 内存连续

	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}

	// 释放
	free(a[0]);

	return 0;
}

4、第二维已知(内存连续)

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

const int cols = 9;

int main()
{
	int rows;
	printf("请输入二维数组行数:");
	scanf("%d", &rows);
	//scanf_s("%d", &rows, sizeof(rows));

	// 分配
	int(*a)[cols];
	a = (int(*)[cols])malloc(rows * cols * sizeof(int));

	// 置零
	/*
	for (int i = 0; i < rows; i++)
	{
		memset(a[i], 0, cols * sizeof(int));
	}*/
	memset(a, 0, rows * cols * sizeof(int)); // 内存连续

	// 遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}

	// 释放
	free(a);

	return 0;
}

三、C++三维数组 - 动态分配、释放

第一维、第二维、第三维均未知

#include <iostream>
#include <memory.h>
using namespace std;

int main()
{
	int x, y, z;
	cout << "请输入三维数组第一维长度:";
	cin >> x;
	cout << "请输入三维数组第二维长度:";
	cin >> y;
	cout << "请输入三维数组第三维长度:";
	cin >> z;

	// 分配
	int*** a = new int** [x];
	for (int i = 0; i < x; i++)
	{
		a[i] = new int* [y];
		for (int j = 0; j < y; j++)
		{
			a[i][j] = new int [z];
		}
	}

	// 置零
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			memset(a[i][j], 0, z * sizeof(int));
		}
	}

	// 遍历
	for (int i = 0; i < x; i++)
	{
		cout << "矩阵" << i + 1 << ":" << endl;
		for (int j = 0; j < y; j++)
		{
			for (int k = 0; k < z; k++)
			{
				cout << a[i][j][k] << " ";
			}
			cout << endl;
		}
		cout << endl;
	}

	// 释放
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			delete [] a[i][j];
		}
		delete [] a[i];
	}
	delete [] a;

	return 0;
}

四、C三维数组 - 动态分配、释放

第一维、第二维、第三维均未知

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main()
{
	int x, y, z;
	printf("请输入三维数组第一维长度:");
	scanf("%d", &x);
	//scanf_s("%d", &x, sizeof(x));
	printf("请输入三维数组第二维长度:");
	scanf("%d", &y);
	//scanf_s("%d", &y, sizeof(y));
	printf("请输入三维数组第三维长度:");
	scanf("%d", &z);
	//scanf_s("%d", &z, sizeof(z));

	// 分配
	int*** a = (int***)malloc(x * sizeof(int**));
	for (int i = 0; i < x; i++)
	{
		a[i] = (int**)malloc(y * sizeof(int*));
		for (int j = 0; j < y; j++)
		{
			a[i][j] = (int*)malloc(z * sizeof(int));
		}
	}

	// 置零
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			memset(a[i][j], 0, z * sizeof(int));
		}
	}

	// 遍历
	for (int i = 0; i < x; i++)
	{
		printf("矩阵%d:\n", i + 1);
		for (int j = 0; j < y; j++)
		{
			for (int k = 0; k < z; k++)
			{
				printf("%d ", a[i][j][k]);
			}
			printf("\n");
		}
		printf("\n");
	}

	// 释放
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			free(a[i][j]);
		}
		free(a[i]);
	}
	free(a);

	return 0;
}

参考:

C与C++中二维数组的动态分配内存方法

C++中的delete和delete[]的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值