我正在使用一个库,它需要一个带有void*
指针作为参数的函数。我有一个2D字符串数组,我想通过该参数传递该数组并在函数中提取它。我成功地将数组作为指针传递,但我不知道如何将指针转换回数组。
这是我现在的代码:
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库的sqlite3_exec()
函数,并将“SELECT SQL查询”的结果存储到2D字符串数组中。
SQLite C Interface - One-Step Query Execution Interface的
2条答案
按热度按时间yzxexxkh1#
你不能将一个指针强制转换为一个数组。相反,你可以通过另一个指针访问你的数组。那个指针的类型是
String (*)[10]
。像这样字符串
你创建指针的方式,你不需要使用
&
,你访问指针的方式,你不需要使用*
,在你的代码中也是错误的。详细信息请参见上面的代码。这里的基本问题(也许是你误解的问题)是
String *x[10];
和String (*x)[10];
之间的区别。在第一种情况下,x
是指向String
的10个指针的数组,在第二种情况下,x
是指向10个String
的数组的指针。这是你想要的第二个选项。62lalag42#
行
String* str_array_ptr[100][10];
没有声明一个指向String
对象的2D数组的指针;相反,它声明了一个指向String
对象的2D数组指针。声明一个指向2D数组的指针的语法很复杂;在你的例子中,它是下面的(声明
str_array_ptr
作为一个指向String
对象的100 x 10数组的指针):字符串
static_cast
(当源操作数是void*
时可以),您会得到以下代码:型
有人可能会说,如果你真的想使用这样一个指向2D数组的指针,(在C中可能有更好的设计解决方案,例如the answer posted by john),那么您可以用
typedef
或using...
语句为该指针定义一个类型(例如using StrArrPtrType = decltype(&str_array);
);然而,C和C编程社区通常不赞成(严重和正确地)将指针隐藏在typedef
或using
别名之后。