c ++ 2维静态数组与2维动态指针兼容

时间:2015-09-24 18:43:36

标签: c++

有没有办法声明与动态指针(TYPE **)兼容的二维静态数组?

char strs1[2][256] = { "String 1", "String 2" }; // Static

我想要的是将其分配给

char **strs2 = strs1;

好吧,我可以这样做:

std::array<std::array<char, 256>, 2> arr = {"String 1", "String 2"};
char *temp[2] = { (char*)&arr[0], (char*) &arr[1] };
char **strs = (char**)temp;

cout << strs[0] << endl;
cout << strs[1] << endl;

// Output
String 1
String 2

但有没有更好更简单的方法来实现相同的结果?

2 个答案:

答案 0 :(得分:1)

char **永远不能成为引用数组数组的方法(C / C ++中没有二维数组),因为它没有内部数组大小的信息。特别是,编译器无法在以下代码段中生成正确的访问代码:

char** arr = initialize_by_hack();
arr[2][4] = '42';

这里,要计算第二个偏移量(4),编译器需要知道元素数组的大小 - 但是代码中没有任何内容并且不可用。

答案 1 :(得分:0)

不,你无法改变二维数组与T**不兼容的事实。

你只能执行像你在问题中提出的那样的hacky变通办法,或者纠正最初导致你达到要求的错误或设计缺陷。

既然你正在编写C ++:为什么不使用正确的,现代的,类型安全的技术而不是原生数组和乱七八糟的指针?一个简单的Matrix<T,W,H>类模板包装一个静态分配的T[W*H]但暴露二维索引会很好。然后通过引用传递它(或者,如果你真的必须,通过指针)。