【问题标题】:How should I pass this integer array in to this function?我应该如何将这个整数数组传递给这个函数?
【发布时间】:2014-12-17 00:55:18
【问题描述】:

对于这个作业,我的教授给了我们以下函数头:

void thisFunc(Node** root, const int * elements[], const int count)

大概,这是正确的,我无法更改。

Const int *elements 是一个使用 scanf 获取的 int 值数组;我用

声明了我的
int entries[atoi(argv[1])-1];

并成功填充

   for(int a=0; a < atoi(argv[1]); a++) {
      scanf("%i", &entries[a]);
   }

但我很难调用 thisFunc。

   thisFunc(&bst, entries, atoi(argv[1]));

这会引发明显的错误:

note: expected 'const int **' but argument is of type 'int *'

如果我是对的,它需要一个指向整数指针的常量数组吗?我应该如何处理条目数组才能使其成为有效参数?

我尝试通过引用 (&entries) 传递条目,但我有点迷茫。

【问题讨论】:

  • const int * elements[] 不是整数数组。它是一个指向整数的指针数组..
  • @haris 实际上,它根本不是一个数组。调整为指向int的指针。
  • @juanchopalnza 仅在用作函数参数时。但这真的是在争论 symantix。
  • @aruisdante 是一个函数参数。这是一个重要的区别。
  • @aruisdante 不是故意粗鲁,但我认为您的意思是“语义”,除非有一个我不参与的内部笑话。

标签: c pointers parameter-passing


【解决方案1】:

签名暗示你要传递一个指向指针的指针,这反过来又建议动态分配(而不是可变长度数组):

// Read the length once, and store it for future reference.
// Calling atoi on the same string multiple times is inefficient.
int len = atoi(argv[1]);
int *entries = malloc(sizeof(int) * len);
... // Populate the data in the same way, but use len instead of atoi(argv[1])
...
// Now you can take address of entries
thisFunc(&bst, &entries, len);
...
// Do not forget to free memory allocated with malloc once you are done using it
free(entries);

注意:话虽如此,我几乎可以肯定你的教授在声明thisFunc 时犯了一个小错误,应该这样声明:

void thisFunc(Node** root, const int elements[], const int count)

我认为这应该是正确签名的原因是,使变量成为指针背后需要有一个意图,而使elements 成为const 指针指向指针显然缺少这种意图。因为elementsconst,所以签名告诉我thisFunc 不会修改elements 后面的数据。同时,通过使用指针,签名告诉我它将修改elements 本身,这看起来不像函数要做什么,因为elements 在其他地方被读取。

【讨论】:

  • 当然!我应该意识到的。我是 C 的新手并且习惯了 Java,所以我仍然习惯于能够管理内存的选项。非常感谢。 :)
  • 现在我收到错误“预期为 'const int **' 但参数的类型为 'int **'”。你有什么建议吗?
  • 如果函数需要一个指向 int 数组的指针的指针,则此方法有效,但如果它需要指向 int 的指针数组,则此方法无效。函数头可能意味着任何一个,但对我来说,数组括号建议后者(对于前者,我希望const int **elements而不是const int *elements[])。
  • @Rohawk 我几乎可以肯定你的教授犯了一个错误:他在elements 前面多加了一个星号。您可以使用强制类型转换 (demo) 使其与 const 双指针一起运行,但它没有用:无论如何您都不应该修改条目,并且您需要在 myFunction 内进行额外的取消引用。如果没有额外的星号,它会更自然,并且不需要强制转换 (another demo)。
  • 如果在 main 我创建“const int * nums = entries;”,它似乎可以工作,使用 &nums 作为第二个参数调用函数,然后在 thisFunc 中创建“const int * test = *elements; "并将值称为“test[#]”。我绝对不怀疑有更好的方法来处理这个问题,所以我仍然非常愿意接受建议。我会试试你刚刚发布的,再次感谢。
【解决方案2】:

如果您想使用您提到的函数修改数组条目[] 中的值,请将您的调用更改为: thisfunc(&bst, &entries, atoi(argv[1]));

问题是您传递的是一个数组“条目”,但您的函数需要一个指向 int array[] 的指针。所以传递条目的地址是“&entries”。

【讨论】:

    【解决方案3】:

    您是否尝试过隐式转换?

    (const int**)variable;
    

    完成;)

    【讨论】:

    • 我知道你不能发表评论..但在发帖前请思考和思考你的答案..
    • 错误?试试return **(const int**)entries;时会发生什么...
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2017-08-19
    • 2020-11-27
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多