概述
二级指针定义
int x=1;
int *p=&x;
int **op=*p;
二级指针往往与二维数组有关
当函数返回值为二维数组时
申请二维数组模板
int **myMalloc(int r, int c, int* returnSize, int** returnColumnSizes) {
int i;
int **ret = (int **)malloc( sizeof(int *) * r ); // (1)
*returnColumnSizes = (int *)malloc( sizeof(int) * r ); // (2)
*returnSize = r; // (3)
for(i = 0; i < r; ++i) {
ret[i] = (int *)malloc( sizeof(int) * c ); // (4)
(*returnColumnSizes)[i] = c; // (5)
}
return ret;
}
(1)为二维数组申请空间
int **ret =(int **)malloc(sizeof(int *)*r)
(2)基本的告诉returnsize 和returncolumnsize
*returnsize=r
*returncolumnsize=malloc(sizeod(int)*r)returncolumnsize是个一维数组,存放每一行的列数,这一操作是在为他申请空间,因此长度为行数
(3)
用for循环(1到r)为每一行的列数赋值c(列数)
第一题
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int**mymalloc(int h,int l,int*returnSize,int**returnColumnSizes)
{
int**ret=(int**)malloc(sizeof(int*)*h);
*returnColumnSizes=(int *)malloc(sizeof(int)*h);//为数组的列申请一个数组来记录每一行的列数
*returnSize=h;
for(int i=0;i<h;i++)
{
ret[i]=(int *)malloc(sizeof(int)*l);//申请每一行的内存空间
(*returnColumnSizes)[i]=l;
}
return ret;
}
int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){
int h=imageSize;
int l=imageColSize[0];
int **ret=mymalloc(h,l,returnSize,returnColumnSizes);//这样就申请好了
for(int i=0;i<l;i++)
{
for(int j=0;j<h;j++)
{
ret[i][j]=1-image[i][l-j-1];
}
}
return ret;//模板里已经写好returnsize
}
使用模板申请二维数组空间
第二题
int **myMalloc(int r, int c, int* returnSize, int** returnColumnSizes) {
int **ret = (int **)malloc( sizeof(int *) * r ); // (1)
*returnColumnSizes = (int *)malloc( sizeof(int) * r ); // (2)
*returnSize = r; // (3)
for(int i = 0; i < r; ++i) {
ret[i] = (int *)malloc( sizeof(int) * c ); // (4)
(*returnColumnSizes)[i] = c; // (5)
}
return ret;
}
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
int n=matSize;
int m=matColSize[0];
int **ret=myMalloc(r,c,returnSize,returnColumnSizes);
if(n*m!=r*c)
{
*returnSize=n;//告诉有几行
for(int i=0;i<n;i++)//告诉每一行的列数长度
{
(*returnColumnSizes[i])=m;
}
return mat;
}
else{
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
int id=i*c+j;
ret[i][j]=mat[id/m][id%m];
}
}
return ret;
}
return 0;
}
算法没啥难,难在模板怎么用
int** shiftGrid(int** grid, int gridSize, int* gridColSize, int k, int* returnSize, int** returnColumnSizes){
int row=gridSize;
int col=*gridColSize;
*returnSize=row;
*returnColumnSizes=(int*)malloc(sizeof(int)*row);
int**ret=(int**)malloc(sizeof(int*)*row);
k %= (row * col);
for(int i = 0; i < row; i++)
{
(*returnColumnSizes)[i] = col;
ret[i] = (int*)malloc(sizeof(int) * col);
for(int j = 0; j < col; j++)
{
int id = (row * col + i * col + j - k ) % (row * col);
ret[i][j] = grid[id / col][id % col];
}
}
return ret;
}
总结:
(1)不建议用模板,总的来说就是
1.将题目给的行和列转化row col
2.说明*retunsize和*returncolumnsize(记得加*)
*returnsize=行
*returncolumnsize=(int *)malloc(sizeof(int)*row)
3.给二维数组申请空间
int**ret=(int **)malloc(sizeof(int*)*row
3.用for循环给recolsize数组每个元素赋值
for(int i=0;i<行;i++)
{
(*returnsize)[i]=col}
2.矩阵的转化问题
都可以先求出id:各个元素在原矩阵中是第几个位置
后[id/m][id%m]
最后
以上就是高高猫咪为你收集整理的解题报告(8)二级指针的全部内容,希望文章能够帮你解决解题报告(8)二级指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复