在我的主要内容中,我将此函数称为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)) ===|
答案 0 :(得分:3)
传递后,a
,b
和c
会衰减到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;
}