2017-02-16 168 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 **)。