用指针指针初始化矩阵?

时间:2017-02-16 23:23:11

标签: c arrays pointers

假设我使用以下内容初始化了一个矩阵:

double** m = (double**) calloc(count, sizeof(*double));
for (int i = 0; i < count; i++){
        *(m+i) = (double*) calloc(count, sizeof(double));
}

现在我想通过以下声明将此矩阵传递给函数:

double func(void* params)

以下是从params获取矩阵的正确方法:

double** m = *(double**) params;

然后我可以正常访问m中的元素? E.g。

double a = m[1][2];

2 个答案:

答案 0 :(得分:1)

你没有说你如何称呼这个功能。但如果调用是func(m),则函数中的代码将为double** m = params;

您发布的代码是违规行为(将double *分配给double **)。

答案 1 :(得分:1)

对于初学者这段代码

double** m = (double**) calloc(count, sizeof(double));
                                      ^^^^^^^^^^^^^
for (int i = 0; i < count; i++){
        *(m+i) = (double*) calloc(count, sizeof(double*));
                                         ^^^^^^^^^^^^^^^  
}

无效。

我认为你的意思是

double** m = (double**) calloc(count, sizeof(double *));
                                      ^^^^^^^^^^^^^^^^
for (int i = 0; i < count; i++){
        *(m+i) = (double*) calloc(count, sizeof(double));
                                         ^^^^^^^^^^^^^  
}

此功能声明

double func(void* params);

没有意义。阵列(矩阵)的大小未知。你应该指定大小。

该函数可以声明为

double func(void* params, int size );

在你可以编写的函数中

double **a = params;

并使用

之类的表达式
a[i][j]

其中i和j属于范围[0, count)

并调用函数

func( m, count );