[问题] 动态配置下二维阵列参数传递

楼主: bben900911 (Ben)   2015-02-03 19:34:54
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
None
问题(Question):
想尝试练习指标与阵列的相关使用
compile时就宣告好大小的二维阵列依照置底方式传递应该没问题
在动态配置的阵列传递时,想要采用转成一维阵列却无法得到正确结果
喂入的资料(Input):
row=5
column=5
预期的正确结果(Expected Output):
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
错误结果(Wrong Output):
5*5的完全不是1的数字
程式码(Code):(请善用置底文网页, 记得排版)
#include<stdio.h>
int c_array(int *a,int row,int column,int i,int j)
{
printf("%d ",*( a + i*column +j ) );//使用pointer来控制矩阵
}
int main(void)
{
int **ptr=NULL;
int row,column;
int i,j;
while(1)
{
printf("row=\n");
scanf("%d",&row);
printf("column=\n");
scanf("%d",&column);
if(row==0 && column==0) break;
ptr=(int**)malloc(sizeof(int*)*row);
//生成一维指标阵列
for(i=0;i<row;i++)
{
ptr[i]=(int*)malloc(sizeof(int)*column);
}//二维
for(i=0;i<row;i++)
{
for(j=0;j<column;j++)
{
ptr[i][j]=1;
}
}//将矩阵付值:1
for(i=0;i<row;i++)
{
for(j=0;j<column;j++)
{
//printf("%d",ptr[i][j]);//测试用
c_array((int*)ptr,row,column,i,j);//使用另外函数来print
}
printf("\n");//换行
}
for(i=0;i<row;i++) free(ptr[i]);
free(ptr);//释放内存
}
return 0;
}
补充说明(Supplement):
楼主: bben900911 (Ben)   2015-02-03 19:40:00
http://ideone.com/JQjKaJ 舒服阅读版
作者: PkmX (阿猫)   2015-02-03 19:52:00
(int*) ptr这边是错的吧...你把存放每个一维阵列指标的阵列的位置传过去了...
楼主: bben900911 (Ben)   2015-02-03 19:57:00
那大概怎么传呢@@? 抱歉pointer就是在练习中QQ
作者: BombCat (炸弹猫)   2015-02-03 20:04:00
楼主: bben900911 (Ben)   2015-02-03 20:08:00
能够讨教个中原理吗?(跪
作者: wenyonba (射后不理很XX啊!!!!)   2015-02-03 20:12:00
这不画个图,老实说用文字讲起来还满难讲的 XD
楼主: bben900911 (Ben)   2015-02-03 20:14:00
我先说我的理解:我原本的作法是把二维矩阵平面化成一维:p11 p12 p13 p21 p22 p23..所以我在函数内的处理上以为传进的Pointer就可以进行操作成数值(ex: p23=*(&p11+3*1+3)但我是用pointer动态配置二维矩阵的也就是函数看到的就真的只是一个一维矩阵,上面一堆P一堆pointer,所以反而应该用双重矩阵去解读,再拆开双重指标*
作者: EdisonX (卡卡兽)   2015-02-03 20:26:00
*( a + i*column +j ) 一维阵列表示二维阵列,不同等动态二维取索引,最大的差别是可能不连续,碎片化。当然还有额外指标空间,没画图真不好说
楼主: bben900911 (Ben)   2015-02-03 20:28:00
我后来的理解大致上是对的吗? 还有依照炸弹猫大修改后,传入那边 无论使用ptr、(int*)ptr、(int**)ptr、(int***)ptr都会是正解why?
作者: wenyonba (射后不理很XX啊!!!!)   2015-02-03 20:32:00
楼上大哥讲出重点了,可以再想想如果找一个你身边的人会的,画个图,你应该三秒就懂 XD
楼主: bben900911 (Ben)   2015-02-03 20:34:00
所以我推文的后来想法还是错的吗QQ就:我把内涵一堆指标的一维矩阵丢进函数对这东西作一维处理,不管怎样都(ry
作者: wenyonba (射后不理很XX啊!!!!)   2015-02-03 20:38:00
www.programmer-club.com.tw/ShowSameTitleN/c/45669.html 有点长,网址分两段打回文里有个图,你看看也许有帮助
作者: BombCat (炸弹猫)   2015-02-03 20:57:00
我觉得你的后来想法应该是对的ptr、(int*)ptr、(int**)ptr、(int***)ptr都会是正解是因为C语言的type checking比较宽松,JAVA、Pascal就没办法让你这样compile过对c_array而言,a的tpye就是int **不管它的值怎么取得的
楼主: bben900911 (Ben)   2015-02-03 21:10:00
也就是我不管在那一行怎么cast,c_array都会用双重指标接所以OK。然而其他语言的compiler再检查双边type时比较严格,所以应该是只有(int **) ptr 过?
作者: BombCat (炸弹猫)   2015-02-03 21:13:00
我觉得是这样啦 :)
楼主: bben900911 (Ben)   2015-02-03 21:14:00
感谢楼上各位大大,感激不尽
作者: PkmX (阿猫)   2015-02-03 21:17:00
题外话:炸弹猫那个*(*(a+i)+j)其实就是a[i][j] XD

Links booklink

Contact Us: admin [ a t ] ucptt.com