c++ 将void指针转换为2D String数组指针

xqkwcwgp  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(96)

我正在使用一个库,它需要一个带有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

yzxexxkh

yzxexxkh1#

你不能将一个指针强制转换为一个数组。相反,你可以通过另一个指针访问你的数组。那个指针的类型是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 '&'
}

字符串
你创建指针的方式,你不需要使用&,你访问指针的方式,你不需要使用*,在你的代码中也是错误的。详细信息请参见上面的代码。
这里的基本问题(也许是你误解的问题)是String *x[10];String (*x)[10];之间的区别。在第一种情况下,x是指向String的10个指针的数组,在第二种情况下,x是指向10个String的数组的指针。这是你想要的第二个选项。

62lalag4

62lalag42#

String* str_array_ptr[100][10];没有声明一个指向String对象的2D数组的指针;相反,它声明了一个指向String对象的2D数组指针。
声明一个指向2D数组的指针的语法很复杂;在你的例子中,它是下面的(声明str_array_ptr作为一个指向String对象的100 x 10数组的指针):

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中可能有更好的设计解决方案,例如the answer posted by john),那么您可以用typedefusing...语句为该指针定义一个类型(例如using StrArrPtrType = decltype(&str_array););然而,C和C编程社区通常不赞成(严重和正确地)将指针隐藏在typedefusing别名之后。

相关问题