2017-02-16 130 views
0

假设我有初始化用下面的矩阵:用指向指针的指针初始化矩阵?

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** m = *(double**) params; 

然后,我可以正常访问m中的元素?例如。

double a = m[1][2]; 
+0

这通常被认为是不好的形式以这样的方式为无效现有的答案编辑的问题的功能。 – EOF

+0

我明白了,对不起,我认为这与我的问题无关,而且只是一个错字。但是我明白。 –

回答

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); 
1

你没有说你如何调用函数。但如果调用func(m)然后在函数中的代码将double** m = params;

您发布的代码是constaint冲突(分配double *double **)。