将矩阵提升到C的n次方 void matRaise(int n,int m,int***a){ 整数**x; x=(int**)calloc(n,sizeof(int*)*(n)); 对于(int i=0;i

将矩阵提升到C的n次方 void matRaise(int n,int m,int***a){ 整数**x; x=(int**)calloc(n,sizeof(int*)*(n)); 对于(int i=0;i,c,C,比如说2 2 2 矩阵升到四次方这是输出 5763456 5763456 我真的不明白我做错了什么。我知道我没有用最有效的算法来解决这类问题,但既然我开始用这种方法来解决它,我真的很想知道哪里出了错。x=y并不像你想象的那样 x和y都是指针。它们可能指向一些复杂的东西,但它们本身只不过是地址而已。当您将一个指针分配给另一个指针时,您正在用另一个地址替换一个地址 执行此赋值指令后,x和y指向同一位置,通过y修改值也会修改x中存储的值 更一般地,对于C.中复杂数据类型的表示要非常小心,考虑执行辅助函

比如说2 2 2 矩阵升到四次方这是输出

5763456

5763456


我真的不明白我做错了什么。我知道我没有用最有效的算法来解决这类问题,但既然我开始用这种方法来解决它,我真的很想知道哪里出了错。

x=y
并不像你想象的那样

x
y
都是指针。它们可能指向一些复杂的东西,但它们本身只不过是地址而已。当您将一个指针分配给另一个指针时,您正在用另一个地址替换一个地址

执行此赋值指令后,
x
y
指向同一位置,通过
y
修改值也会修改
x
中存储的值


更一般地,对于C.中复杂数据类型的表示要非常小心,考虑执行辅助函数以进行分配、元素访问、复制等。

1。你是否得到了二次幂的正确结果,以及这个矩阵?2.对于对角矩阵,你得到了正确的结果吗?3.m,n,p是什么?4.为什么指针指向指针指向指针?嗨,你确定你的x[i][i]在第三位吗??请使用更好的可变名称,这里很难理解…@einpoklum是的,对不起,我的代码有点乱;m表示将矩阵提升到的功率u;n它是行数和列数;我认为这是不言自明的,因为我想真正了解mth的力量。@AlexB这是身份matrix@einpoklum对于矩阵X和矩阵A的第一次乘法,我得到了正确的结果,我使用指针对指针,因为我想修改a的值,所以我需要处理它的地址,基本上你是说,如果x和y在同一个函数中分配了内存,它们将指向同一个位置?
void matRaise( int n, int m, int ***a){
    int **x;
    x = (int **) calloc(n, sizeof(int *) * (n));
    for (int i = 0; i < n; i++)
        *(x + i) = (int *)calloc(n, sizeof(int) * (n));


    int **y;
    y = (int **) calloc(n, sizeof(int *) * (n));
    for (int i = 0; i < n; i++)
        *(y + i) = (int *)calloc(n, sizeof(int) * (n));


    for (int i = 0; i < n; i++)
        x[i][i]=1;


    for(int p = 0; p < m; p++){
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++){
                y[i][j]=0;
                for(int k = 0; k < n; k++)
                    y[i][j] += *(*(x + i) + k) * (*(*(*a + k) + j));
            }

        x = y;
    }
    *a = x;
}