C 矩阵幂和指针
我试图用乘法计算矩阵A的幂。 我对ArrayPower函数有问题。它的功能并不像我认为的那样。不过,多数组函数似乎工作得很好。有人能帮我吗C 矩阵幂和指针,c,pointers,matrix,multidimensional-array,C,Pointers,Matrix,Multidimensional Array,我试图用乘法计算矩阵A的幂。 我对ArrayPower函数有问题。它的功能并不像我认为的那样。不过,多数组函数似乎工作得很好。有人能帮我吗 #include <stdio.h> int** MultiArray(int a[2][2],int b[2][2]); int** ArrayPower(int a[2][2],int e); int main(void) { int fa[2][2]; fa[0][0]=0; fa[0][1]=1;
#include <stdio.h>
int** MultiArray(int a[2][2],int b[2][2]);
int** ArrayPower(int a[2][2],int e);
int main(void)
{
int fa[2][2];
fa[0][0]=0;
fa[0][1]=1;
fa[1][0]=1;
fa[1][1]=1;
int **multifa=malloc(sizeof(int)*2);
for (int i=0;i<2;i++) {
multifa[i]=malloc(sizeof(int)*2);
}
multifa=ArrayPower(fa,2);
printf("%d %d\n",multifa[0][0],multifa[0][1]);
printf("%d %d\n",multifa[1][0],multifa[1][1]);
return 0;
}
int** MultiArray(int a[2][2], int b[2][2]) {
//multi a *b
//memory allocation
int i,rows=2,cols=2;
int **c=malloc(rows*sizeof(int));
for (i=0;i<rows;i++) {
c[i]=malloc(cols*sizeof(int));
}
c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1];
c[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
c[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1];
return c;
}
int** ArrayPower(int a[2][2],int e) {
//memory allocation
int i,rows=2,cols=2;
int **c=malloc(rows*sizeof(int));
for (i=0;i<rows;i++) {
c[i]=malloc(cols*sizeof(int));
}
c[0][0]=a[0][0];
c[0][1]=a[0][1];
c[1][0]=a[1][0];
c[1][1]=a[1][1];
for (i=1;i<e;i++) {
c=MultiArray(a,c);
}
return c;
}
#包括
int**MultiArray(inta[2][2],intb[2][2]);
内部**阵列电源(内部a[2][2],内部e);
内部主(空)
{
int fa[2][2];
fa[0][0]=0;
fa[0][1]=1;
fa[1][0]=1;
fa[1][1]=1;
int**multiva=malloc(sizeof(int)*2);
for(int i=0;iMultiArray
声明为使用类型为int[2][2]
的第二个参数,但调用它时使用的参数为c
,该参数为类型为int**
。这些类型不兼容
在参数中,类型int[2][2]
自动转换为指向两个int
数组的指针,类型int(*)[2]
。这是指向两个int
对象所在位置的指针(而且,因为我们知道它是由两个int
对象组成的两个数组的第一个元素,所以我们知道在前两个对象之外还有两个int
对象)
带有int**c
的c
的定义意味着c
是指向int
的指针。指向指针的指针和指向数组的指针不同且不兼容
解决此问题的一种方法是使用int(*c)[2]=malloc(2*sizeof*c);
定义c
。这样就不需要在定义之后有循环来分配更多空间;单个分配分配分配整个数组
MultiArray
的返回类型以及其中的代码和程序中的其他地方都应该进行类似的更改。或者,MultiArray
的第二个参数可以从int b[2][2]
更改为int**b
。(后者更容易编辑,但生成的程序较差,因为它使用的指针和分配比需要的多。)
您应该始终在编译代码时启用警告。这会提醒您错误的调用。为什么要为multifa
分配内存?您这样做的方式是,在调用ArrayPower()后失去对已分配内存的引用并且会泄漏内存。你说得对!这是不必要的。谢谢你的帮助!