error: invalid type argument of unary ‘*’ (have ‘int’) *(*(m+r)+c) = s; //save it in the resulting matrix
error: invalid type argument of unary ‘*’ (have ‘int’) *(*(m+r)+c) = s; //save it in the resulting matrix
int main(void)
{
int r,c,i,j,k,s;
printf("Enter the numbers of columns of the matrices: "); //asking the user about the rows and columns
scanf("%d%d",&r,&c);
int *arr = (int *)malloc(r * c * sizeof(int)); //dynamically alloting the array 1
int *a = (int *)malloc(r * c * sizeof(int)); //dyanamically alloting the array 2
int *m = (int *)malloc(r*c*sizeof(int)); //dynamically alloting the resulting array
printf("Enter the elements for the first matrix: \n"); //entering the elements of array 1
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", (*( arr + r ) + c));
}
printf("\n");
}
printf("Enter the elements for the second matrix: \n"); //entering the elements of array 2
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", (*( a + r ) + c));
}
printf("\n");
}
for(i=0;i<r;i++) //multiplying the matrices
{
for(j=0;j<c;j++)
{
s=0; //alloting an element and it's value as zero
for(k=0;k<c;k++)
{
s += (*(arr+r)+k) * (*(a+k)+ c);
}
*(*(m+r)+c) = s; //save it in the resulting matrix
}
}
printf("The multiplied matrix is: \n"); //printing the multiplied matrix
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
printf("%d ",(*( m + r) + c));
printf("\n");
}
free(arr);
free(a);
free(m);
return 0;
您的代码中存在多个问题,我猜测是对指针和数组的工作方式存在误解。
首先你需要知道对于任何指针(或数组)m
和索引r
,表达式*(m + r)
是正好等于m[r]
。如果我们在您的表达式 *(*(m + r) + c)
中进行此替换,那么它将是 *(m[r] + c)
,您似乎希望成为 m[r][c]
.
它至少存在三个问题:
首先是m[r]
是一个int
,所以m[r] + c
也是一个int
,不能引用。
第二个是您在表达式中使用数组 sizes,而不是 i
和 j
位置。
第三个问题是,虽然可以使用一个一维数组模拟数组的数组,但它们不像指针那样工作,并且 仅使用普通加法无法获得其中元素的算法。
虽然前两点应该很容易理解,但最后一点可能有点难。第一个需要知道数组的数组是如何在内存中布局的,所以让我们来看一个简单的数组:
int m[2][3];
这在内存中看起来像这样:
+---------+---------+---------+---------+---------+---------+
| m[0][0] | m[0][1] | m[0][2] | m[1][0] | m[1][1] | m[1][2] |
+---------+---------+---------+---------+---------+---------+
要得到 m[i][j]
,我们不能只是将 i
和 j
相加来获得偏移量。例如,让我们以 i == 0
和 j == 1
为例,那么 i + j
将是 1
。这与 i == 1
和 j == 0
冲突,其中 i + j
的总和也将是 1
。所以这两种情况(i == 0 && j == 1
和 i == 1 && j == 0
)都会使用我们不想要的相同元素。
相反,我们需要对“行”数使用乘法(在本例中为i
),对列使用加法(j
) .我们需要乘以行大小 2
。因此,要获得 m[i][j]
,我们将使用 m + (i * 2) + j
(使用上面定义的示例数组)。
所以在您的代码中,每当您尝试在“矩阵”中使用单个单元格时,您需要使用 m[i * r + j]
。
指针arr
(以及程序中的其他指针)声明为
int *arr = (int *)malloc(r * c * sizeof(int));
具有类型 int *
。所以取消引用指针
scanf("%d", (*( arr + r ) + c));
你得到一个 int
类型的对象,而函数 scanf
需要一个指针..
而且在这些循环中
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", (*( arr + r ) + c));
}
printf("\n");
}
表达式 (*( arr + r ) + c)
既不依赖于 i
也不依赖于 j
。
你至少应该这样写
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", arr + i * c + j );
}
printf("\n");
}
另一种方法确实是分配一个二维可变长度数组,如
int ( *arr )[c] = (int *)malloc( sizeof( int[r][c] ) );
并使用两个索引来访问数组的元素。
注意矩阵的乘法运算维度不正确。也就是说,如果第一个矩阵的维度为 r
和 c
,则第二个矩阵的维度应为 c
和 r
,结果矩阵的维度为 r
和r
.
int main(void)
{
int r,c,i,j,k,s;
printf("Enter the numbers of columns of the matrices: "); //asking the user about the rows and columns
scanf("%d%d",&r,&c);
int *arr = (int *)malloc(r * c * sizeof(int)); //dynamically alloting the array 1
int *a = (int *)malloc(r * c * sizeof(int)); //dyanamically alloting the array 2
int *m = (int *)malloc(r*c*sizeof(int)); //dynamically alloting the resulting array
printf("Enter the elements for the first matrix: \n"); //entering the elements of array 1
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", (*( arr + r ) + c));
}
printf("\n");
}
printf("Enter the elements for the second matrix: \n"); //entering the elements of array 2
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", (*( a + r ) + c));
}
printf("\n");
}
for(i=0;i<r;i++) //multiplying the matrices
{
for(j=0;j<c;j++)
{
s=0; //alloting an element and it's value as zero
for(k=0;k<c;k++)
{
s += (*(arr+r)+k) * (*(a+k)+ c);
}
*(*(m+r)+c) = s; //save it in the resulting matrix
}
}
printf("The multiplied matrix is: \n"); //printing the multiplied matrix
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
printf("%d ",(*( m + r) + c));
printf("\n");
}
free(arr);
free(a);
free(m);
return 0;
您的代码中存在多个问题,我猜测是对指针和数组的工作方式存在误解。
首先你需要知道对于任何指针(或数组)m
和索引r
,表达式*(m + r)
是正好等于m[r]
。如果我们在您的表达式 *(*(m + r) + c)
中进行此替换,那么它将是 *(m[r] + c)
,您似乎希望成为 m[r][c]
.
它至少存在三个问题:
首先是
m[r]
是一个int
,所以m[r] + c
也是一个int
,不能引用。第二个是您在表达式中使用数组 sizes,而不是
i
和j
位置。第三个问题是,虽然可以使用一个一维数组模拟数组的数组,但它们不像指针那样工作,并且 仅使用普通加法无法获得其中元素的算法。
虽然前两点应该很容易理解,但最后一点可能有点难。第一个需要知道数组的数组是如何在内存中布局的,所以让我们来看一个简单的数组:
int m[2][3];
这在内存中看起来像这样:
+---------+---------+---------+---------+---------+---------+ | m[0][0] | m[0][1] | m[0][2] | m[1][0] | m[1][1] | m[1][2] | +---------+---------+---------+---------+---------+---------+
要得到 m[i][j]
,我们不能只是将 i
和 j
相加来获得偏移量。例如,让我们以 i == 0
和 j == 1
为例,那么 i + j
将是 1
。这与 i == 1
和 j == 0
冲突,其中 i + j
的总和也将是 1
。所以这两种情况(i == 0 && j == 1
和 i == 1 && j == 0
)都会使用我们不想要的相同元素。
相反,我们需要对“行”数使用乘法(在本例中为i
),对列使用加法(j
) .我们需要乘以行大小 2
。因此,要获得 m[i][j]
,我们将使用 m + (i * 2) + j
(使用上面定义的示例数组)。
所以在您的代码中,每当您尝试在“矩阵”中使用单个单元格时,您需要使用 m[i * r + j]
。
指针arr
(以及程序中的其他指针)声明为
int *arr = (int *)malloc(r * c * sizeof(int));
具有类型 int *
。所以取消引用指针
scanf("%d", (*( arr + r ) + c));
你得到一个 int
类型的对象,而函数 scanf
需要一个指针..
而且在这些循环中
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", (*( arr + r ) + c));
}
printf("\n");
}
表达式 (*( arr + r ) + c)
既不依赖于 i
也不依赖于 j
。
你至少应该这样写
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%d", arr + i * c + j );
}
printf("\n");
}
另一种方法确实是分配一个二维可变长度数组,如
int ( *arr )[c] = (int *)malloc( sizeof( int[r][c] ) );
并使用两个索引来访问数组的元素。
注意矩阵的乘法运算维度不正确。也就是说,如果第一个矩阵的维度为 r
和 c
,则第二个矩阵的维度应为 c
和 r
,结果矩阵的维度为 r
和r
.