LeetCode做题笔记(2)——使用动态内存分配定义一个二维数组

本篇文章是在做LeetCode 题目#566时总结的,主要进一步学习了二维数组及指针的指针用法。

566. 重塑矩阵

题目类型

数组

做题总结

1. 如何通过动态内存分配的方式构建一个二维数组空间?:首先根据行数r动态分配r个int *类型的空间,然后再为每一行分配列数c个int类型的空间,具体实现如下:

int i;
int **matrix = (int **) malloc( r * sizeof(int *) );
for( i = 0; i < r; ++r )
{
    maxtrix[i] = (int *) malloc( c * sizeof(int) );
}

在使用matrix时,可以直接像二维数组一样用下标,如matrix[3][4]
2. 关于本题传入的二维数组nums的类型:nums类型为int **,是指针的指针,因此:

    • nums可能是一个指针数组的数组名,数组元素类型为int ,使用的时候可以用下标,nums[3]为指针数组中第4个指针,但能否使用第二重下标就未必了,因为数组中的指针可能指向一维数组,这时可以用二重指针,如nums[3][4],表示nums中第4个指针指向的数组数组中的第5个元素;数组中的指针也可能指向一个数,这时就不能用二重下标了,除非二重下标为0,如nums[3][0],这种情况下要用(nums[3])。
    • 当然nums也可能是一个一维数组的指针(相当于二维数组中只有一个元素的情况)
    • nums也可能是一个数的指针的指针,nums->pa->a=5,**nums==5
    • 实际上,int **类型变量后面到底隐藏着什么,谁也不知道,但具体到本题时,nums一定得是“元素为一维数组的指针 的 数组”的数组名,nums可以像二维数组一样使用下标。二维数组的内存空间是连续的,但是nums中元素的存储一般不是连续的,这里所说的连续指的是一维数组的尾和下一个一维数组的头在地址上不是连续的,这一点可以从上面的动态分配二维数组空间的方式看出。
posted @ 2020-04-20 17:27  凉风SK  阅读(780)  评论(0编辑  收藏  举报