菜鸟求助:二维数组/二级指针作为参数时的问题

Jarvan89 2014-06-23 05:52:00
重新开始看C++的基础知识,看到二维数组这块时,发现一个问题,如下:
代码目的为初始化一个二维数组并输出:

#include <iostream>
using namespace std;
void print2darray(int** a,int x,int y)
{
//print
for( int i = 0 ;i< x ;++i)
{
for( int j = 0 ;j<y ;++j)
cout << *((int*)(a+i)+j) << " " ;
cout << endl ;
}
}
int main()
{
int a[3][3]={0};
int n = 0 ;
//initialization
for( int i = 0 ;i < 3 ;++i )
{
for( int j = 0 ; j < 3 ;++j)
{
++n ;
*(*(a+i)+j)=n;
}
}
//print
print2darray((int**)a,3,3);
return 0 ;
}

上述代码运行的结果是:
1 2 3
2 3 4
3 4 5
这个并非是代码原本的目的,因为希望得到的结果是:
1 2 3
4 5 6
7 8 9
而将上述代码中的print2darray()函数中的代码放到main()函数中,即可得到期望结果,请问这是为什么?

使用的环境是VS2010旗舰版,WIN7 64位系统。
还有,为什么在调试的过程中,二维数组/二级指针的值在添加监视时显示的是“CX0030错误:无法计算表达式的值”?


跪求高手指点!!多谢
...全文
262 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-06-25
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int **p;
int **newarr2d(int rows,int cols) {
    int **p,i;

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

    for (i=0;i<rows;i++) {
        free(p[i]);
    }
    free(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
//
赵4老师 2014-06-25
  • 打赏
  • 举报
回复
引用 7 楼 benimaur0 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:]
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
感谢解答。 不过我很好奇的是,为啥同样的代码,在main函数里就可以实现,封装到其他函数里就有问题呢?[/quote]
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int **p;
int **newar2d(int rows,int cols) {
    int **p,i;

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

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

    r=4;
    c=5;
    arr2d=newar2d(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");
    }
    deletear2d(arr2d,r);

    r=6;
    c=3;
    arr2d=newar2d(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");
    }
    deletear2d(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
//
Jarvan89 2014-06-25
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
感谢解答。 不过我很好奇的是,为啥同样的代码,在main函数里就可以实现,封装到其他函数里就有问题呢?
Jarvan89 2014-06-25
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
数组没有多维,只有一维,所谓多维,只是一维的递归定义。 而指针只跟一维数组有关系。 多级指针和“多维”数组没有任何关系。
原来如此,感谢指点~
Jarvan89 2014-06-25
  • 打赏
  • 举报
回复
引用 1 楼 u012061345 的回复:
把第一个参数改成int(*a)[3]
好的,我试试
Jarvan89 2014-06-25
  • 打赏
  • 举报
回复
感谢赵老师的解答。 不过我想了解的东西,3L已经解答我了,感谢各位的回复!
ForestDB 2014-06-24
  • 打赏
  • 举报
回复
数组没有多维,只有一维,所谓多维,只是一维的递归定义。 而指针只跟一维数组有关系。 多级指针和“多维”数组没有任何关系。
赵4老师 2014-06-24
  • 打赏
  • 举报
回复
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
liutengfeigo 2014-06-23
  • 打赏
  • 举报
回复
数组a的类型不是你想的那样.
罗博士 2014-06-23
  • 打赏
  • 举报
回复
把第一个参数改成int(*a)[3]

33,311

社区成员

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

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