将double*转换为double(*)[N]

use*_*ica 10 c arrays casting

void compute(int rows, int columns, double *data) {
    double (*data2D)[columns] = (double (*)[columns]) data;
    // do something with data2D
}

int main(void) {
    double data[25] = {0};
    compute(5, 5, data);
}
Run Code Online (Sandbox Code Playgroud)

有时,将参数视为多维数组非常方便,但需要将其声明为指向平面数组的指针.将指针视为多维数组是否安全,compute如上例所示?我很确定内存布局可以保证正常工作,但我不知道标准是否允许指针以这种方式进行转换.

这会破坏任何严格的别名规则吗?指针算法的规则怎么样; 由于数据"实际上不是"a double[5][5],我们是否允许执行指针算法和索引data2D,或者是否违反了指针算法不会偏离适当数组范围的要求?是data2D即使保证指向正确的地方,还是它只是保证我们可以将它转换回并恢复data?标准报价将非常感激.

Flo*_*dis 0

在这种情况下,最安全的方法是将元素保留在平面一维数组中,但编写访问器方法以多维方式从此数组中读取和写入。

#include <stdio.h>
#include <string.h>

const int rowCount = 10;
const int columnCount = 10;

const int dataSize = rowCount*columnCount;
double data[dataSize];


void setValue( const int x, const int y, double value)
{
    if ( x>=0 && x<columnCount && y>=0 && y<rowCount) {
        data[x+y*columnCount] = value;
    }
}


double getValue( const int x, const int y )
{
    if ( x>=0 && x<columnCount && y>=0 && y<rowCount) {
        return data[x+y*columnCount];
    } else {
        return 0.0;
    }
}


int main()
{
    memset(data, 0, sizeof(double)*dataSize);
    // set a value
    setValue(5, 2, 12.0);
    // get a value
    double value = getValue(2, 7);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该示例使用全局变量只是为了简单起见。您可以将数据数组作为附加参数传递给函数,甚至可以创建一个要使用的上下文。

在 C++ 中,您可以将数据容器包装到一个类中,并使用这两个方法作为访问方法。