二维数组中的指针

时间:2013-11-27 14:09:29

标签: c

我有这个代码用于矩阵乘法,但它给了我一个编译错误。我需要一个函数来接收3个矩阵的指针及其维数N作为参数。

#include <stdio.h>
#define N 100

void matrixmul(int **matA, int **matB, int **matC, int n){

    int i,j,k;

    for(i=0;i<n;i++){   
    for(j=0;j<n;j++){
        matC[i][j] = 0;
        for(k=0;k<n;k++){
        matC[i][j] += matA[i][k] * matB[k][j];
        }
    }
    }

}

int main(){

    int matA[N][N]={1};
    int matB[N][N]={3};
    int matC[N][N];

    int i,j,k;

    matrixmul(&matA, &matB, &matC, N);

    for(i=0;i<N;i++){   
    for(j=0;j<N;j++){
        printf("%d ", matC[i][j]);
    }
    printf("\n");
    }

    return 0;

}

错误是:

teste.c: In function ‘main’:
teste.c:28:5: warning: passing argument 1 of ‘matrixmul’ from incompatible pointer type [enabled by default]
teste.c:5:6: note: expected ‘int **’ but argument is of type ‘int (*)[100][100]’
teste.c:28:5: warning: passing argument 2 of ‘matrixmul’ from incompatible pointer type [enabled by default]
teste.c:5:6: note: expected ‘int **’ but argument is of type ‘int (*)[100][100]’
teste.c:28:5: warning: passing argument 3 of ‘matrixmul’ from incompatible pointer type [enabled by default]
teste.c:5:6: note: expected ‘int **’ but argument is of type ‘int (*)[100][100]’

3 个答案:

答案 0 :(得分:2)

指针不是数组 所有&matA&matB&matC都是int (*)[100][100]类型(指向包含100个100个整数数组的数组的指针),但您的函数matrixmul正在期待int **类型的参数(Nint类型除外) 将您的功能定义更改为

void matrixmul(int (*matA)[N], int (*matB)[N], int (*matC)[N], int n){ ... }  

并将其从main称为

 matrixmul(matA, matB, matC, N);

答案 1 :(得分:2)

您可以尝试这些更改。

void matrixmul(int matA[][N], int matB[][N], int matC[][N], int n)

可以像这样调用这个函数

matrixmul(matA, matB, matC, N);

答案 2 :(得分:1)

错误是由指针指针的数组不同引起的。数组是固定长度的对象集合,它们按顺序存储在内存中。指向指针的指针,即使它可以用作数组,编译器也不保证2d矩阵的存储器是连续的。 消除你的功能的一种方法是:

void matrixmul(int matA[][N], int matB[][N], int matC[][N], int n)

如果你想将de matrix作为指针传递给指针,你必须像这样分配内存:

int **array = new int *[N];

for(int i = 0; i<N; i++)

    array[i] = new int[N];`