如何在c ++中将动态数组转换为静态数组?

时间:2011-04-07 06:43:16

标签: c++ arrays casting

在c ++中,如何将动态数组转换为静态?

我有

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

我的函数参数是类型 int[9][9],如何投射da以便我的函数可以使用它?

3 个答案:

答案 0 :(得分:10)

int[9][9]是内存中连续的81个整数,占用81*sizeof(int)个字节。 int *[9]是指向整数的9个指针的序列,占用9*sizeof(int *)个字节。这些中的每一个都设置为指向9个不同的9个整数序列。

你不能用一个代替另一个 - 没有任何演员会改变这两个在内存中的布局完全不同。

答案 1 :(得分: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];
    }
}

原因:明确定义了2D数组的布局和对齐,并定义了实现。函数的实现需要精确的布局和对齐方式。任何其他布局显然会引入一个错误。

即使int tmp[9*9]也不保证与int tmp[9][9]相同。

幸运的是,在堆栈上创建它并复制到/从中便宜。

答案 2 :(得分: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);