如何从函数返回char[][][]类型的指针?静态三维字符数组场景
如何返回三维字符数组的指针
首先得明确你的city_names数组的类型:它是包含1000个元素的数组,每个元素又是const char[4][50](4个长度为50的字符数组)。要返回它的指针,得匹配对应的指针类型——直接用static_cast<void*>虽然能转换,但后续使用时还要转回来,既不直观也容易出错,更推荐直接返回正确的类型。
方法1:直接返回匹配的指针类型
你可以把函数的返回类型声明为const char (*)[4][50],这是指向const char[4][50]类型的指针,正好和city_names数组名隐式转换后的类型一致(数组名会自动转为指向第一个元素的指针):
static const char city_names[1000][4][50]; const char (*getCityNames())[4][50] { return city_names; }
调用时直接用这个指针访问元素就行:
auto cities = getCityNames(); // 访问第i个城市的第j个字符串:cities[i][j]
方法2:用别名简化复杂类型
上面的返回类型写法有点绕,你可以用C++11的using(或旧版的typedef)定义类型别名,让代码更清晰:
// 定义指针类型别名 using CityArrayPtr = const char (*)[4][50]; static const char city_names[1000][4][50]; CityArrayPtr getCityNames() { return city_names; }
方法3:返回指向整个三维数组的指针
如果你想返回指向整个1000×4×50数组的指针(而非第一个元素的指针),返回类型要写成const char (*)[1000][4][50],返回时取数组的地址:
const char (*getCityNames())[1000][4][50] { return &city_names; }
调用时需要先解引用指针再访问元素:
auto cities = getCityNames(); // 访问第i个城市的第j个字符串:(*cities)[i][j]
关于static_cast<void*>的补充
其实你尝试的static_cast<void*>转换本身是能成功的,比如:
void* getCityNames() { return static_cast<void*>(city_names); }
但问题在于,从void*转回原类型时必须明确写出正确的指针类型,否则会出错:
void* ptr = getCityNames(); // 转换回正确的指针类型 const char (*cityPtr)[4][50] = static_cast<const char (*)[4][50]>(ptr);
这种方式多了一次转换,容易出错,所以还是前面几种直接返回正确类型的方法更稳妥。
内容的提问来源于stack exchange,提问作者Ghasem Ramezani
相关产品推荐
相关产品推荐

