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

c++ 2 dimensional static array compatible with 2 dimensional dynamic pointer

本文关键字:2维 动态 指针 数组 静态 c++      更新时间:2023-10-16

是否有一种方法可以声明与动态指针(TYPE**)兼容的2维静态数组?

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

但是有没有更好更简单的方法来达到同样的结果呢?

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

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

在这里,要计算第二个偏移量(4),编译器需要知道元素数组的大小-但它在代码中无处可寻,并且不可用。

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

您只能执行像您在问题中假设的那样的hack变通方法,或者纠正最初导致您产生需求的错误或设计缺陷。

既然你在写c++:为什么不使用适当的,现代的,类型安全的技术,而不是本地数组和一堆指针?一个简单的Matrix<T,W,H>类模板,包装一个静态分配的T[W*H],但暴露二维索引将是很好的。然后通过引用(或者,如果你真的需要,通过指针)传递它。