传递数组的地址

时间:2016-04-06 21:26:44

标签: c

在我的主要内容中,我将此函数称为add

add(a,b,c,row,col);

其定义如下:

void add(int **a,int **b,int **c,int row,int col)
{

    int i,j;
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            c[i][j]=a[i][j]*b[i][j];
        }
    }
}

主要功能:.......

int main()
{
    int c[5][5],i,j;
    int **f; 
    int a[5][5],b[5][5],row,col; 
    printf("Enter row : ");
    scanf("%d",&row); 
    printf("Enter column : ");
    scanf("%d",&col);
    printf("Enter matrix A :\n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    printf("Enter matrix B :\n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            scanf("%d",&b[i][j]);
        }
    }


    add(a,b,c,row,col);  

    printf("Addition :\n");

    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            printf("%d\t",c[i][j]);
        }
        printf("\n");
    }
    getch();
    return 0;
}

编译器给出的错误:

||warning: command line option '-Wzero-as-null-pointer-constant' is valid for C++/ObjC++ but not for C [enabled by default]|
C:\Users\Amir Khasru\Desktop\matrix_add.c|5|warning: no previous declaration for 'add' [-Wmissing-declarations]|
C:\Users\Amir Khasru\Desktop\matrix_add.c||In function 'main':|
C:\Users\Amir Khasru\Desktop\matrix_add.c|45|error: passing argument 1 of 'add' from incompatible pointer type|
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|

3 个答案:

答案 0 :(得分:3)

传递后,abc会衰减到int (*)[5],而不是int **

所以你应该把你的功能重写为:

void add(int a[][5], int b[][5], int c[][5], size_t row, size_t col)
{
    size_t i, j;
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < col; j++)
        {
            c[i][j] = a[i][j] * b[i][j];
        }
    }
}

答案 1 :(得分:1)

混淆是因为int x[5]不是指针。它可以用作指针,但它实际上是一个5 int的块。根据这个逻辑,int y[5][5]也不是双指针。但是,这不能用作双指针。只是因为没有指向每一行的实际指针。它只是一堆(25)整数,你(和编译器)知道每行有多大。这样你就知道元素[0,4]是第一行[5,9],第二行等等。 这意味着您必须告诉函数行的日志。有两种方法可以做到这一点。一种是明确地添加5x5的接受块

void add(int a[5][5],int b[5][5],int c[5][5],int row,int col){
   ...
}

另一种方法是将其作为单个指针(例如int* a)传递,并将宽度作为另一个参数传递。

答案 2 :(得分:1)

在您的添加功能中,int**不是int[][] 两者都是非常不同的数据类型,一个是数组数组,另一个是指向指针的指针。您应该将其声明为int (*name)[size] 或者(这恰好是我最喜欢的方式),将它强制转换为指针,然后使用简单的指针算法 -

int add(int *a, int *b, int *c, int rows, int columns, int rowsize){
    for(int i = 0; i < rows; i++){
        for(int j = 0; j < columns; j++){
            *(c + rowsize*i + j) = (*(a + rowsize*i + j))*(*(b + rowsize*i + j));
        }
    }
    return 0;
}