二维数组指针作为参数,函数返回值也是一个二维数组指针时该如何写?为什么下面的程序结果是错的。
#include<iostream>
using namespace std;
int** MatrixATranspose(int **A,int m,int n)
{//A是m行n列,那么B是n行m列,此函数是求矩阵A的转置矩阵B;
int **B;
int i,j;
B=new int *[n];
for(i=0;i<n;i++)
{
B[i]=new int[m];
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
B[j][i]=*((int *)A+n*i+j);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cout<<B[i][j]<<" ";
}
cout<<endl;
}
return B;
}
void MatrixABMultiply(int **A,int **B,int m,int n)
{
int **C;
int i,j,k;
C=new int *[m];
for(i=0;i<m;i++)
{
C[i]=new int[m];
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
int s=0;
for(k=0;k<n;k++)
{
int a=*((int *)A+n*i+k);
int b=*((int *)B+k*m+j);
s=s+a * b;
}
C[i][j]=s;
}
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
cout<<C[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int i;
int A[3][2];
int **B;
for(i=0;i<3;i++)
{
A[i][0]=1;
A[i][1]=3;
}
B=MatrixATranspose((int **)A,3,2);
MatrixABMultiply(B,(int **)A,2,3);
return 0;
}
函数MatrixATranspose((int **)A,3,2);的运行结果是正确的,
但函数MatrixABMultiply(B,(int **)A,2,3);的运行结果却是很大的数。
函数MatrixABMultiply中:
int a=*((int *)A+n*i+k); 》》改成亩前滑》》 int a=A[i][k]; 即可!
因为实参中的B中的元素不是连续存放的,故采用
*((int *)A+n*i+k) 形式访问错误!
因为*((int *)A+n*i+k)获得的值是地址,故“运行结果却是很大的数”,
你可以调试程序,看变量的值迅腊就非常清楚了!
另外,非常非常重要的一点:(指针+n)移动的距悔饥离是“指针指向的对象类型的长度 * n”,
比如,(int *)A经过强制转换后,A已经成为int型指针,+n操作就是移动n个整数,即sizeof(int) * n,此后取得的就是地址值(地址被当成整数来访问了,故其“是很大的数”!)
MatrixATranspose(int **A,int m,int n)这样传参是错的,你的A是个二维数组团基拿,记住一句话,“指向整型指针的指针”与“指向整形数组的指针“是不同的。
A[3][2]是个二维数组即数组的数组。也就是说,A是什么呢,A是一个数组,是一个有三个元素的数组,只不过它的每个元素是一个整型数组,而不是整型数。这也是为什么叫你记住“指向整型指针的指针”与“指向整形数组的指针”是不同的。
因为指针运算,所以你在传参时必须指定A中每个元素指向的数组的大小,要不然没法进行指针运算,i*n+j,也就是说,你要说明那个n是多少,要不然瞎乘一个数,肯定会出错。
所以作为参数的二维数组应该这样写int (*A)[2],注意那个圆括号不要落下,要是落下了,因为[]的优先级高于*,所以A就成了“指向整型指针的指针“了。
所以你的函数参数应该这样写: MatrixATranspose(int (*A)[2]....)。
ps:(1)然后你可能有个疑问,为什么一维数组参数可以写成MatrixATranspose(int *A....)呢,因为它和A[n]的A含义相同,都是指向整型数的指针。(2)我给你纠正的只是参数错误,我粗略看了下你的程序,其实你的第塌搭一个函数逻辑就有问题。我现在很忙,只给你指出一个错误,程序逻辑你自己纠正吧。(3)你真抠!才5分,开始我都不想回答,我回答这个问题都快5分钟了。O(∩_∩)O~希望对你有用。
我把这个锋迹问题我写了个总结,戳这:http://blog.csdn.net/michealtx/article/details/7173247