求助关于int arr[m][n][2]变长数组改为int (**arr)[2]程序该怎么修改

学码就是爱好 2020-10-15 01:01:49
原程序是论坛一位同学的矩阵打印问题引发的,我编写了一个增强版,只会才用变长数组解决,想知道如果用指针怎么解决
#include <stdio.h>

int main()
{
unsigned int a=0,b=0;
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
while(scanf("%d %d",&a,&b))
{
int c[a][b][2];//此处不采用变长数组,而是采用指针,后面的内存申请怎么处理
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
{
c[i][j][0]=i;
c[i][j][1]=j;
}
for(int i=0;i<a;i++,printf("\n"))
for(int j=0;j<b;j++)
printf("[%d %d]",c[i][j][0],c[i][j][1]);
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
}
return 0;
}


另外 为什么我采用函数调用就得不到正确的运行
#include <stdio.h>
void primatrix(int pa,int pb,int pc[pa][pb][2]);
void assmatrix(int aa,int ab,int ac[aa][ab][2]);
int main()
{
unsigned int a=0,b=0;
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
while(scanf("%d %d",&a,&b))
{
int c[a][b][2];

assmatrix(a,b,c[a][b][2]);
primatrix(a,b,c[a][b][2]);
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
}
return 0;
}
void primatrix(int pa,int pb,int pc[pa][pb][2])
{
for(int i=0;i<pa;i++,printf("\n"))
for(int j=0;j<pb;j++)
printf("[%d %d]",pc[i][j][0],pc[i][j][1]);
}
void assmatrix(int aa,int ab,int ac[aa][ab][2])
{
for(int i=0;i<aa;i++)
for(int j=0;j<ab;j++)
{
ac[i][j][0]=i;
ac[i][j][1]=j;
}
}
...全文
181 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2020-10-16
  • 打赏
  • 举报
回复
再来个c++ new delete的,供参考:
#include <stdio.h>
#include <stdlib.h>
int **newarr2d(int rows,int cols) {
    int **p,i;

    p=new int *[rows];
    if (NULL==p) exit(1);
    for (i=0;i<rows;i++) {
        p[i]=new int[cols];
        if (NULL==p[i]) exit(1);
    }
    return p;
}
void deletearr2d(int **p,int rows) {
    int i;

    for (i=0;i<rows;i++) {
        delete[] p[i];
    }
    delete[] p;
}
int main() {
    int **arr2d,i,j,r,c;

    r=4;
    c=5;
    //在堆中开辟一个4×5的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    r=6;
    c=3;
    //在堆中开辟一个6×3的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    return 0;
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//  0  1  2
//  3  4  5
//  6  7  8
//  9 10 11
// 12 13 14
// 15 16 17
//
学码就是爱好 2020-10-16
  • 打赏
  • 举报
回复
感谢,多了分配失败的机制
赵4老师 2020-10-16
  • 打赏
  • 举报
回复
//在堆中开辟一个2×3×4×5的4维int数组
#include <stdio.h>
#include <malloc.h>
int ****p;
int h,i,j,k;
void main() {
    p=(int ****)malloc(2*sizeof(int ***));
    if (NULL==p) return;
    for (h=0;h<2;h++) {
        p[h]=(int ***)malloc(3*sizeof(int **));
        if (NULL==p[h]) return;
        for (i=0;i<3;i++) {
            p[h][i]=(int **)malloc(4*sizeof(int *));
            if (NULL==p[h][i]) return;
            for (j=0;j<4;j++) {
                p[h][i][j]=(int *)malloc(5*sizeof(int));
                if (NULL==p[h][i][j]) return;
            }
        }
    }
    for (h=0;h<2;h++) {
        for (i=0;i<3;i++) {
            for (j=0;j<4;j++) {
                for (k=0;k<5;k++) {
                    p[h][i][j][k]=h*60+i*20+j*5+k;
                }
            }
        }
    }
    for (h=0;h<2;h++) {
        for (i=0;i<3;i++) {
            for (j=0;j<4;j++) {
                for (k=0;k<5;k++) {
                    printf(" %3d",p[h][i][j][k]);
                }
                printf("\n");
            }
            printf("--------------------\n");
        }
        printf("=======================\n");
    }
    for (h=0;h<2;h++) {
        for (i=0;i<3;i++) {
            for (j=0;j<4;j++) {
                free(p[h][i][j]);
            }
            free(p[h][i]);
        }
        free(p[h]);
    }
    free(p);
}
//   0   1   2   3   4
//   5   6   7   8   9
//  10  11  12  13  14
//  15  16  17  18  19
//--------------------
//  20  21  22  23  24
//  25  26  27  28  29
//  30  31  32  33  34
//  35  36  37  38  39
//--------------------
//  40  41  42  43  44
//  45  46  47  48  49
//  50  51  52  53  54
//  55  56  57  58  59
//--------------------
//=======================
//  60  61  62  63  64
//  65  66  67  68  69
//  70  71  72  73  74
//  75  76  77  78  79
//--------------------
//  80  81  82  83  84
//  85  86  87  88  89
//  90  91  92  93  94
//  95  96  97  98  99
//--------------------
// 100 101 102 103 104
// 105 106 107 108 109
// 110 111 112 113 114
// 115 116 117 118 119
//--------------------
//=======================
//
学码就是爱好 2020-10-16
  • 打赏
  • 举报
回复
引用 3 楼 赵4老师 的回复:
帮结帖+蹭分
欢迎大神,羡慕你的功力
赵4老师 2020-10-16
  • 打赏
  • 举报
回复
帮结帖+蹭分
学码就是爱好 2020-10-16
  • 打赏
  • 举报
回复
上午有空,找了一些资料研究了一下,利用三级指针编写了程序,程序运行正常,请大神点评一下,因为申请内存与释放内存与一般的教科书不太一样,不知道是否有问题,会不会有内存泄漏
// 增强版矩阵,采用指针完成
#include <stdio.h>
#include <stdlib.h>
#define COL 2
int main()
{
unsigned int a=0,b=0;
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
while(scanf("%u %u",&a,&b))
{
int ***p;//定义三级指针
p=(int ***)malloc(a*sizeof(int **));//为指针分配内存
for(int i=0;i<a;i++)
{ p[i]=(int **)malloc(b*sizeof(int *));
for(int j=0;j<b;j++)
p[i][j]=(int *)malloc(COL*sizeof(int));
} //为指针分配内存
for(int i=0;i<a;i++) //为矩阵赋值
for(int j=0;j<b;j++)
{
p[i][j][0]=i;
p[i][j][1]=j;
} //为矩阵赋值
for(int i=0;i<a;i++,printf("\n")) //输出矩阵
for(int j=0;j<b;j++)
printf("[%d %d]",p[i][j][0],p[i][j][1]);//输出矩阵

for(int i=0;i<a;i++) //释放内存
{for(int j=0;j<b;j++)
free(p[i][j]);
free(p[i]);
}
free(p); //释放内存
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
}
return 0;
}
/* 增强版矩阵,采用数组完成
#include <stdio.h>

int main()
{
unsigned int a=0,b=0;
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
while(scanf("%u %u",&a,&b))
{
int c[a][b][2];

for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
{
c[i][j][0]=i;
c[i][j][1]=j;
}
for(int i=0;i<a;i++,printf("\n"))
for(int j=0;j<b;j++)
printf("[%d %d]",c[i][j][0],c[i][j][1]);

printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
}
return 0;
}
*/

/* 增强版矩阵,采用函数及数组完成
#include <stdio.h>
void primatrix(int pa,int pb,int pc[pa][pb][2]);
void assmatrix(int aa,int ab,int ac[aa][ab][2]);
int main()
{
unsigned int a=0,b=0;
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
while(scanf("%u %u",&a,&b))
{
int c[a][b][2];

assmatrix(a,b,c);
primatrix(a,b,c);
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
}
return 0;
}
void primatrix(int pa,int pb,int pc[pa][pb][2])
{
for(int i=0;i<pa;i++,printf("\n"))
for(int j=0;j<pb;j++)
printf("[%d %d]",pc[i][j][0],pc[i][j][1]);
}
void assmatrix(int aa,int ab,int ac[aa][ab][2])
{
for(int i=0;i<aa;i++)
for(int j=0;j<ab;j++)
{
ac[i][j][0]=i;
ac[i][j][1]=j;
}
}
*/
/*简单的同纬度矩阵
#include <stdio.h>
void matrix(int a);
int main()
{
unsigned int a=0;
printf("Introduzca un numero(entre 1 y ~,非数字退出) :");
while(scanf("%u",&a))
{
matrix(a);
printf("Introduzca un numero(entre 1 y ~,非数字退出) :");
}
return 0;
}
void matrix(int a)
{
for(int i=0;i<a;i++,printf("\n"))
for(int j=0;j<a;j++)
printf("[%d %d]",i,j);
}
*/

学码就是爱好 2020-10-16
  • 打赏
  • 举报
回复
如果是我理解的这样,在指针按数组样式使用时 p[i][j],实际上地址不是简单累加的,而如果不采用p[][]而采用 p、*、(、)这4个符号,怎么来表示多维的元素?
学码就是爱好 2020-10-16
  • 打赏
  • 举报
回复
另外想问一下,直接使用 int arr[4][5],应该是要求内存必须连续,而申请的内存大小是 4*5个int大小;
而如果采用 int **arr//[4][5],是不是要求第一维的指针数组必须是连续的,大小是4个指针的大小,而每个第二维的int 数组大小是 5个int大小,它们是连续的,
但是这4个大小5int的内存可以不连续。所以用指针比数组要求的内存要大,但是内存只有限连续,如图:
学码就是爱好 2020-10-16
  • 打赏
  • 举报
回复
厉害,一般C++都包含对C的支持,这样会不会把语法记混了,我目前学C是打基础,后面想继续学习C++,然后编点小程序玩玩。暂定的目标是,利用Qt与Mysql以及对Excel的操作,编一个小型的题库练习软件。不过如果这个在1年以内实现不了,可能就没办法坚持了,毕竟编程只是爱好,不是我的本职工作。
学码就是爱好 2020-10-15
  • 打赏
  • 举报
回复
第一个问题 关于调用不成功,自己想到了可能的问题,经测试已解决。
#include <stdio.h>
void primatrix(int pa,int pb,int pc[pa][pb][2]);
void assmatrix(int aa,int ab,int ac[aa][ab][2]);
int main()
{
unsigned int a=0,b=0;
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
while(scanf("%d %d",&a,&b))
{
int c[a][b][2];
assmatrix(a,b,c);//之前参数传递形式错了,参数在声明和使用时是不一样的
primatrix(a,b,c);//同上
printf("Introduzca 2 numero(entre 1 y ~,非数字退出) :");
}
return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧