如何在C语言中将const数组或变量数组传递给函数?

8
我有一个简单的函数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 - ereOn
2个回答

10

你想要:

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

参数声明const Foo *x的意思是:

x是指向一个Foo类型的指针,我承诺不会更改它。

您可以使用这个原型将非常量指针传递给Bar


我认为这声明了一个“不能被改变的Foo指针”,而不是一个“指向不能被改变的Foo”的指针”。 - CodeFusionMobile
7
不 - const Foo *x 的意思是:*x 是一个 const Foo。如果要将参数声明为不可更改的指针(远不如有用),则需要编写 Foo * const x :) - psmears
感谢澄清。正如您所看到的,我写的是Foo*而不是*x,因为我将x视为Foo*,而不是将*x视为指向Foo的指针。这使得跟踪变量更容易,但会使像指向const的指针之类的事情变得相当令人困惑。 - CodeFusionMobile

0

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

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


当我传递一个可变引用到一个常量数组时,会出现类型限定符不匹配的警告。我该如何解决这个问题? - CodeFusionMobile
@CSharperWithJava:你之所以会出现错误,是因为在Bar的声明中缺少了const - psmears
正如其他人所回复的那样 - 如果你正在传递一个常量值(除非你有一个特别宽容的编译器!),你需要将指针参数设为const。 - Martin Beckett
不行。我的编译器一点也不宽容。用于PIC18嵌入式应用的C18编译器。 - CodeFusionMobile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接