指向常量数组的双指针

时间:2017-05-01 15:58:56

标签: c arrays matrix

让我们假设以下C(仅编辑C,而不是C ++)函数从两个矩阵A,B执行矩阵 - 矩阵乘法,并将结果存储在新分配的内存中(C):

double **MatrixMult(double **A, int rowA, int colA, double **B, int rowB, int colB)
{
    double **C = createEmptyMatrix(rowA, colB);
    int i; int j; int k;
    for (i=0;i<rowA;i++)
    {
        for (j=0;j<colB;j++)
        {
            C[i][j] = 0;
            for (k=0;k<rowB;k++)
                C[i][j] += (A[i][k]*B[k][j]);
        }
    }
    return C;
}

矩阵A和B的创建如下:

    double **A = createEmptyMatrix(10,10);
    double **B = createEmptyMatrix(10,10);

具有功能

double **createEmptyMatrix(int rows,int cols)
{
    int i;
    double **L;
    L = (double **) malloc(rows*sizeof(double *));
    for (i = 0; i < rows; i++){
        L[i] = (double *) malloc(cols*sizeof(double));
    }
    return L;
}

现在,我尝试使用SAME函数乘以常量数组(矩阵),如

const double A_const[7][9] =  {
                                  {1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1},
                                  {1.2,2.2,3.2,4.2,5.2,6.2,7.2,8.2,9.2},
                                  {1.3,2.3,3.3,4.3,5.3,6.3,7.3,8.3,9.3},
                                  {1.4,2.4,3.4,4.4,5.4,6.4,7.4,8.4,9.4},
                                  {1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1},
                                  {1.2,2.2,3.2,4.2,5.2,6.2,7.2,8.2,9.2},
                                  {1.3,2.3,3.3,4.3,5.3,6.3,7.3,8.3,9.3}
                              };

具有非常数矩阵B(A_const的维度和内容随机选择)。

基本上,我尝试将const数组的双精度传递给假设double**作为参数的函数。

我想避免更改函数“MatrixMult”的定义。那么,是否可以定义一个**(双指针)到一个常数数组?

1 个答案:

答案 0 :(得分:1)

您可以创建指向2D数组每一行的指针数组:

double *A_const_p[] = { A_const[0], A_const[1], 
                        A_const[2], A_const[3], 
                        A_const[4], A_const[5], A_const[6]};

然后您可以将此数组传递给MatrixMult

但请注意,如果您不想更改功能定义,则需要从const删除A_const限定符。

您也无法更改接受const double **的功能,因为无法为此参数传入double **。有关详细信息,请参阅datalab to google.datalab Migration Guide