【经验杂谈2】动态分配一维数组和二维数组

1.一维数组

1.1一维数组 函数的相关用法

比如一个函数的作用是将一个一维数组中的元素进行排序,下面有两种声明方法:

1 void Sort(int a[], int length);
2 void Sort(int* a, int length);

这两种函数的声明方法其实是等效的,在调用函数的时候,都可以直接传入一个数组。
原理就是前者传入了一个数组名,后者传入了数组的首元素的地址(指针),其实都是传递了数组的首地址,函数内部可以通过指针来访问数组的元素,并进行修改,可以理解为没什么差别。

1.2一维数组的动态分配内存

(C++写法)

int size = 10;
int* array = new int[size];
delete[] array;
  1. int* array 声明了一个指向 int 类型的指针,可以理解为指针数组;
    2)new int[size] 动态分配了一个包含 size 个 int 元素的连续内存块,并返回指向第一个元素的指针,即基地址;
    3)释放内存;

其实许多都是一样的:

C:
struct AdjList* array = (struct AdjList*)malloc(V * sizeof(struct AdjList));
C++:
struct AdjList* array = new struct AdjList[V];

2.二维数组(矩阵)

2.1二维数组 + 函数

1)以列数为参数:

void functionName(int arr[][cols], int rows, int cols);
int arr[3][4];
functionName(arr, 3, 4);

2)使用指针表示:

void functionName(int (*arr)[cols], int rows, int cols);
int arr[3][4];
functionName(arr, 3, 4);

注意这两种函数的写法具有一定局限性

  1. 这两种声明方法都是针对 已知列数的、静态分配的、二维数组无法实现动态分配内存
  2. 在函数声明中省略列数,即void printMatrix(int arr[][3])在函数内部无法使用sizeof()计算行数和列数!因为函数无法获知二维数组的列数。编译器需要知道每一行有多少列,以便正确地解析数组元素的内存布局。省略列数的声明方法只能用于已知列数的情况,因此无法在函数内部动态地获取列数。
    3)指向指针的指针:(可以进行动态内存分配)
void functionName(int** arr, int rows, int cols);
int arr[3][4];
//注意需要将二维数组arr转换为指向指针的指针数组ptr
int* ptr[3];
for (int i = 0; i < 3; i++) {
    ptr[i] = arr[i];
}

functionName(ptr, 3, 4);
  1. 这段代码中,函数的参数是int** a,所以如果直接将二维数组arr传递给函数,会导致类型不匹配的错误。因为arr是一个二维数组,而不是一个指向指针的指针。
  2. ptr[i] = arr[i]; 的作用是将arr[i](二维数组arr中第i行的首地址)赋值给ptr[i](指针数组ptr中第i个元素),从而完成了二维数组到指针数组的转换。
    其实就是ptr是一个指针数组,里面有3个指针(因为对应的arr有3行),这种指针是指向数组的指针。需要将arr每行的首地址赋值给指针数组ptr的相应元素,就可以完成转换。
  3. 可以通过sizeof()来计算数组的行数和列数
  4. 进行动态内存分配

2.2动态内存分配

  1. 来计算行数和列数:
void printMatrix(int** arr) {
    // 获取行数和列数
    int rows = sizeof(arr) / sizeof(arr[0]);
    int cols = sizeof(arr[0]) / sizeof(arr[0][0]);
.........
}
  1. 动态分配内存:
    需要为每一行都分配一个指针数组,然后再为每一行的指针数组分配一个数组。也就是数组里面套数组
int rows = 3;
int cols = 4;

// 分配指向指针的指针(有多少行)
int** matrix = new int*[rows];

// 为每一行开辟空间(每一行有多少元素,也就是有多少列)
for (int i = 0; i < rows; ++i) {
    matrix[i] = new int[cols];
}

1)int** matrix 声明了一个指向 int* 类型的指针,就是二维数组;
2)为行分配指针数组,int*[rows]就相当于一维数组指针嘛,分配几个一维数组;
3)matrix[i] = new int[cols];再为每一行的矩阵分配具体的内存;

  1. 释放内存
for (int i = 0; i < rows; ++i) {
    delete[] matrix[i];  // 释放每一行的数组
}
delete[] matrix;  // 释放行指针数组

先释放每一行指针数组中的元素内存,再释放二维数组中一维数组(个数)的内存;

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值