2011-04-07 40 views
0

在C++中,你如何將一個動態數組轉換爲靜態?如何將動態數組轉換爲C++中的靜態數組?

int ** da; 
da = new int*[9]; 
for (int i=0; i<9; i++) da[i] = new int[9]; 

和我的函數參數是 int[9][9]型的,我怎麼投達所以我的功能可以用嗎?

+0

什麼是您的功能規格? – vickirk 2011-04-07 06:45:34

回答

10

一個int[9][9]是81個整數在內存中連續,取81*sizeof(int)字節。 int *[9]是指向整數的9個指針的序列,取9*sizeof(int *)字節。它們中的每一個都被設置爲指向9個9個不同的9個整數的序列。

你不能用一個替換另一個 - 不會改變這兩個在內存中的佈局完全不同。

1

你不需要 - 如果函數保持其簽名,必須根據需要移動。例如:

void function(int a[9][9]); 

int tmp[9][9]; 

// move to temp 
for (size_t i(0); i < 9; ++i) { 
    for (size_t j(0); j < 9; ++j) { 
     tmp[i][j] = da[i][j]; 
    } 
} 

function(tmp); 

// move to da 
for (size_t i(0); i < 9; ++i) { 
    for (size_t j(0); j < 9; ++j) { 
     da[i][j] = tmp[i][j]; 
    } 
} 

原因:二維數組的佈局和對齊是明確定義的,並且定義了實現。該函數的實現需要確切的佈局和對齊。任何其他佈局顯然會引入一個錯誤。

甚至int tmp[9*9]不保證與int tmp[9][9]相同。

幸運的是,在堆棧上創建並複製到/從便宜。

0

它可能與此問題無關。但它讓我想起使用C的矩陣技巧。好的部分是我們只需要調用malloc並釋放一次。不好的部分是.....

// create the buffer and assign the pointer array 
int i, j; 
int* buffer = (int*) malloc(sizeof(int) * 81); 

int* matrix[9]; // 9 * 9 
for (i = 0; i < 9; ++i) 
    matrix[i] = buffer + i * 9; 

// assign some value using matrix[i][j] 
for (i = 0; i < 9; ++i) 
    for (j = 0; j < 9; ++j) 
     matrix[i][j] = (i + 1) * (j + 1); 

// retrieve the value in matrix 
for (i = 0; i < 9; ++i) 
    for (j = 0; j < 9; ++j) 
     std::cout << matrix[i][j] << " "; 

std::cout << std::endl; 

// free the buffer 
free(buffer);