我是靠谱客的博主 高高猫咪,最近开发中收集的这篇文章主要介绍解题报告(8)二级指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

二级指针定义

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)二级指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部