【问题标题】:How can I pass a const array or a variable array to a function in C?如何将 const 数组或变量数组传递给 C 中的函数?
【发布时间】:2010-06-15 15:15:43
【问题描述】:

我有一个简单的函数Bar,它使用数据集中的一组值,这些值以数据结构数组的形式传入。数据可以来自两个来源:一个常量初始化的默认值数组,或者一个动态更新的缓存。

调用函数确定使用哪些数据并应传递给BarBar 不需要编辑任何数据,实际上不应该这样做。我应该如何声明Bar 的数据参数,以便我可以提供任一集合中的数据?

union Foo
{
long _long;
int _int;
}

static const Foo DEFAULTS[8] = {1,10,100,1000,10000,100000,1000000,10000000};
static Foo Cache[8] = {0};

void Bar(Foo* dataSet, int len);//example function prototype

注意,这是 C,而不是 C++,如果有区别的话;

编辑
哦,还有一件事。当我使用示例原型时,我收到类型限定符不匹配警告,(因为我将可变引用传递给 const 数组?)。为此我需要改变什么?

【问题讨论】:

  • +1,只是因为我很高兴仍有一些人不标记他们的问题C/C++ 并在两者之间有所作为:D

标签: c pointers arrays constants immutability


【解决方案1】:

你想要:

void Bar(const Foo *dataSet, int len);

参数声明const Foo *x表示:

x 是一个指向 Foo 的指针,我 保证不会改变。

您将能够使用此原型将非常量指针传递给Bar

【讨论】:

  • 我认为声明了一个 Foo“无法更改的指针”,而不是指向“无法更改的 Foo”的指针。
  • 否 - const Foo *x 表示:*xconst Foo。要将参数声明为无法更改的指针(这不太有用),您必须编写 Foo * const x :)
  • 感谢您的澄清。如您所见,我写Foo* 而不是*x,因为我认为x 是Foo*,而不是*x 是指向Foo 的指针。它使跟踪变量更容易,但使指向const 的指针等事情变得相当混乱。
【解决方案2】:

正如你所做的那样 - 该函数需要一个指向数据的指针(如果不需要更改它,则为 const)

如果您使用 malloc 分配数据,则传递指针,如果这是静态数组,则传递第一个元素。

【讨论】:

  • 当我这样做时收到类型限定符不匹配警告,因为我将可变引用传递给 const 数组。我该如何解决这个问题?
  • @CSharperWithJava:您收到该错误是因为您当前在 Bar 的声明中缺少 const...
  • 正如其他人回答的那样 - 如果您传递一个常量值,则需要将指针 arg 设为 const(除非您有一个特别宽容的编译器!)
  • 不。我的编译器一点也不宽容。用于 PIC18 嵌入式应用程序的 C18 编译器。
猜你喜欢
  • 2020-07-28
  • 2018-01-20
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2013-10-06
  • 1970-01-01
相关资源
最近更新 更多