C++ 二维数组指针动态创建 - 详细教程和示例代码
C++ 二维数组指针动态创建 - 详细教程和示例代码
在 C++ 中,您可以使用动态内存分配来创建二维数组指针。这允许您在运行时根据需要分配内存,而不是在编译时指定固定大小的数组。以下是一步一步的指南和示例代码:
1. 定义指针的指针变量
首先,您需要定义一个指向指针的指针变量,该变量将指向您的二维数组。例如:
int **arr;
2. 使用 malloc() 分配一维数组内存
使用 malloc() 函数分配一维数组的内存空间,即分配 arr 指向的指针数组。例如:
arr = (int **)malloc(rows * sizeof(int *));
其中 rows 是二维数组的行数。
3. 分配每一行内存空间
使用循环语句为每个指针分配内存空间,即二维数组的每一行。例如:
for (i = 0; i < rows; i++) {
arr[i] = (int *)malloc(cols * sizeof(int));
}
其中 cols 是二维数组的列数。
4. 分配每个元素内存空间
使用二重循环语句为每个指针所指向的一维数组分配内存空间,即二维数组的每一个元素。例如:
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
arr[i][j] = i * cols + j;
}
}
5. 访问和操作二维数组
现在您可以像访问普通二维数组一样访问和操作这个动态分配的数组。
6. 释放内存
使用 free() 函数释放内存空间。首先释放二维数组每一行的内存空间,然后释放指针数组的内存空间。例如:
for (i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
示例代码
#include <stdio.h>
#include <stdlib.h>
int main() {
int **arr;
int rows, cols;
int i, j;
printf("Enter the number of rows: ");
scanf("%d", &rows);
printf("Enter the number of columns: ");
scanf("%d", &cols);
// 分配指针数组内存
arr = (int **)malloc(rows * sizeof(int *));
// 分配每一行内存空间
for (i = 0; i < rows; i++) {
arr[i] = (int *)malloc(cols * sizeof(int));
}
// 为数组赋值
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
arr[i][j] = i * cols + j;
}
}
// 打印数组
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
// 释放内存
for (i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
C++ 数组类实现
以下是一个简单的 C++ 数组类实现,它提供了一些基本的功能,例如动态分配内存和重载 [] 运算符。
#include <iostream>
using namespace std;
class Array {
private:
int* arr;
int size;
public:
Array(int s) {
size = s;
arr = new int[size];
}
~Array() {
delete[] arr;
}
int& operator[](int index) {
return arr[index];
}
int getSize() const {
return size;
}
};
int main() {
Array a(5);
for (int i = 0; i < a.getSize(); i++) {
a[i] = i + 1;
}
for (int i = 0; i < a.getSize(); i++) {
cout << a[i] << " ";
}
return 0;
}
总结
动态创建二维数组指针在需要在运行时分配可变大小的数组时非常有用。通过使用 malloc() 和 free() 函数,您可以有效地管理内存,避免内存泄漏。
希望本文能够帮助您更好地理解和使用二维数组指针的动态创建。
相关资源
原文地址: https://www.cveoy.top/t/topic/jEtG 著作权归作者所有。请勿转载和采集!