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].

它至少存在三个问题:

  1. 首先是m[r]是一个int,所以m[r] + c也是一个int,不能引用。

  2. 第二个是您在表达式中使用数组 sizes,而不是 ij 位置。

  3. 第三个问题是,虽然可以使用一个一维数组模拟数组的数组,但它们不像指针那样工作,并且 仅使用普通加法无法获得其中元素的算法。

虽然前两点应该很容易理解,但最后一点可能有点难。第一个需要知道数组的数组是如何在内存中布局的,所以让我们来看一个简单的数组:

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],我们不能只是将 ij 相加来获得偏移量。例如,让我们以 i == 0j == 1 为例,那么 i + j 将是 1。这与 i == 1j == 0 冲突,其中 i + j 的总和也将是 1。所以这两种情况(i == 0 && j == 1i == 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] ) );

并使用两个索引来访问数组的元素。

注意矩阵的乘法运算维度不正确。也就是说,如果第一个矩阵的维度为 rc,则第二个矩阵的维度应为 cr,结果矩阵的维度为 rr.