有没有办法声明与动态指针(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
但有没有更好更简单的方法来实现相同的结果?
答案 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]
但暴露二维索引会很好。然后通过引用传递它(或者,如果你真的必须,通过指针)。