提问人:ManWithNoName 提问时间:6/2/2023 最后编辑:Rabbid76ManWithNoName 更新时间:11/19/2023 访问量:301
将 void 指针转换为 2D String 数组指针
Casting a void pointer to a 2D String array pointer
问:
我正在使用一个库,它需要一个带有指针作为参数的函数。我有一个 2D 字符串数组,我想通过该参数传递该数组并将其提取到函数中。我成功地将数组作为指针传递,但我不知道如何将该指针转换回我的数组。void*
这是我当前的代码:
String str_array[100][10];
int callback(void* data) {
String* str_array_ptr[100][10] = (String* [100][10])data;
(*str_array_ptr)[0][0] = "text";
return 0;
}
void test() {
callback(&str_array);
}
但是,在编译时,我收到以下错误消息:
错误:ISO C++ 禁止转换为数组类型“String* [100][10]' [-fpermissive]
PS:我正在尝试使用SQLite库的函数并将“SELECT SQL查询”的结果存储到2D字符串数组中。sqlite3_exec()
答:
不能将指针强制转换为数组。相反,您可以通过另一个指针访问您的数组。该指针的类型为 。喜欢这个String (*)[10]
String str_array[100][10];
int callback(void* data) {
String (*str_array_ptr)[10] = (String (*)[10])data;
str_array_ptr[0][0] = "text"; // Note no '*'
return 0;
}
void test() {
callback(str_array); // Note no '&'
}
创建指针的方式(不需要使用)和访问指针的方式(不需要使用)在代码中也是错误的。有关详细信息,请参阅上面的代码。&
*
这里的根本问题(也许是你误解的问题)是 和 之间的区别。在第一种情况下是指向 10 个指针的数组,在第二种情况下是指向 10 个数组的指针。这是您想要的第二个选项。String *x[10];
String (*x)[10];
x
String
x
String
评论
该行不声明指向对象的 2D 数组的指针;相反,它声明指向对象的指针的 2D 数组。String* str_array_ptr[100][10];
String
String
声明指向 2D 数组的指针的语法很棘手;在您的例子中,它如下(声明为指向 100 x 10 对象数组的指针):str_array_ptr
String
String (*str_array_ptr)[100][10];
投射到这样的指针(可以说)更加棘手;使用 C++(当源操作数为 时可以),您将获得以下代码:static_cast
void*
#include <iostream>
#include <string>
using String = std::string;
String str_array[100][10];
int callback(void* data) {
String (*str_array_ptr)[100][10] = static_cast<String (*)[100][10]>(data);
(*str_array_ptr)[0][0] = "text";
return 0;
}
void test() {
callback(&str_array);
}
有人可能会争辩说,如果你真的希望使用这样的指向 2D 数组的指针(C++ 中可能有更好的设计解决方案,例如 john 发布的答案),那么你可以用 or 语句为该指针定义类型(例如);然而,C++ 和 C 编程社区通常不赞成(严重而正确地)隐藏指针或别名。typedef
using...
using StrArrPtrType = decltype(&str_array);
typedef
using
评论
String
String* [100][10]
String
typedef