在C++中,你如何將一個動態數組轉換爲靜態?如何將動態數組轉換爲C++中的靜態數組?
說
我
int ** da;
da = new int*[9];
for (int i=0; i<9; i++) da[i] = new int[9];
和我的函數參數是 int[9][9]
型的,我怎麼投達所以我的功能可以用嗎?
在C++中,你如何將一個動態數組轉換爲靜態?如何將動態數組轉換爲C++中的靜態數組?
說
我
int ** da;
da = new int*[9];
for (int i=0; i<9; i++) da[i] = new int[9];
和我的函數參數是 int[9][9]
型的,我怎麼投達所以我的功能可以用嗎?
一個int[9][9]
是81個整數在內存中連續,取81*sizeof(int)
字節。 int *[9]
是指向整數的9個指針的序列,取9*sizeof(int *)
字節。它們中的每一個都被設置爲指向9個9個不同的9個整數的序列。
你不能用一個替換另一個 - 不會改變這兩個在內存中的佈局完全不同。
你不需要 - 如果函數保持其簽名,必須根據需要移動。例如:
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]
相同。
幸運的是,在堆棧上創建並複製到/從便宜。
它可能與此問題無關。但它讓我想起使用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);
什麼是您的功能規格? – vickirk 2011-04-07 06:45:34