【问题标题】:error: cannot convert 'const char**' to 'const char (*)[64]'错误:无法将 'const char**' 转换为 'const char (*)[64]'
【发布时间】:2020-01-23 08:05:05
【问题描述】:

我尝试实现源代码如下:

bool getParam(char* cmd, char** prm_arr, int num)
{
}

void main()
{
     char strC[] = "btOK,btCancel";
     char foo[10][10];
     bool res = getParam(strC,foo,2);
}

显示错误:

error: cannot convert ‘char (*)[10]’ to ‘char**’ for argument ‘2’ to ‘bool getParam(char*, char**, int)’
     bool res = getParam(strC,foo,2);

我认为 char** 和 char (*)[10] 在这种情况下是相似的,不是吗?

【问题讨论】:

  • 数组不是指针,指针也不是数组。特别是,指向数组的指针不是指向指针的指针。
  • 如果你能做到这一点,函数可以改变*prm_arr 指向其他地方。但改变的是一个更大数组的 10 个元素;能够“让它指向其他地方”是没有意义的。
  • char foo[10][10] 将分配 100 个字符,排列为 10 个块,每个块 10 个字符。它不会创建指向每个块的指针数组。因此,您无法获得指向指针数组 (char **) 的指针。解决方案取决于您想要实现的目标。是否需要将可变大小的二维数组传递给getParam()?

标签: c++ arrays pointers arguments implicit-conversion


【解决方案1】:

声明的数组

char foo[10][10];

在传递给函数时转换为char( * )[10] 类型。并且没有从 char ( * )[10] 类型到 char * 类型的隐式转换。

所以函数声明应该是

bool getParam(char* cmd, char ( *prm_arr )[10], int num);

即在极少数例外的表达式中,数组被转换为指向数组元素类型的指针。

如果你有一个类型为 T 的数组,例如

T a[N];

当数组转换为T * 类型时。

在数组foo 的声明中,其元素的类型是char[10]。所以数组被转换为指向元素类型char ( * )[10]的指针

注意main函数的声明应该是这样的

int main()

而不是

void main()

【讨论】:

  • 以防万一,我想保留 getParam 的函数声明。我如何将 foo 传递给 getParam()。实际上,foo 是根据 type "cmd" 命令动态分配的。
  • @ThaiDao 例如,您可以分配一个指向 char 的动态指针数组。字符 **p = 新字符 *[10];然后在循环中分配 char[10] 类型的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多