Constant 数组和常量对象{}

7
所以你可以这样做:
void foo(const int * const pIntArray, const unsigned int size);

这段话表示指针是只读的,它所指向的整数也是只读的。

你可以在函数内部像这样访问它:

blah = pIntArray[0]

您还可以进行以下声明:
void foo(const int intArray[], const unsigned int size);

这和之前的差不多,但你可以这样做:

intArray = &intArray[1];

我能写这样的代码吗:

void foo(const int const intArray[], const unsigned int size);

这是否正确?

3个回答

15

不,你最后的版本是不正确的。在C99中,你尝试实现的操作可以通过以下新语法来完成。

void foo(const int intArray[const], const unsigned int size);

这相当于

void foo(const int *const intArray, const unsigned int size);

[const]语法是特定于C99的,不适用于C89/90。

请记住,有些人认为函数参数顶层的CV限定符“无用”,因为它们仅对实际参数的副本进行限定。我并不认为它们是无用的,但在现实生活中我个人遇到的使用情况并不太多。


非常好的、富有信息量的回答,谢谢。我会在我的函数中这样写:一个 const 是输入,一个非 const 是输出。例如:void foo(const int inArray[const], int outArray[const]) 表示我将修改 outArray 的内容。这是否是一个明智的设计模式还有待讨论——我刚开始使用它,但对我来说很有意义。同时也缩短了你可能会自己绊倒的绳子——后来的某个人可能会不小心重定向一个指针,但是有了一个 const 指针参数,这是不可能的。 - Matt Clarkson
使用cv限定符的其他原因:它们为未来的读者提供了提示(编写代码主要是为了让人阅读,其次是为了编译器)。它还向编译器和优化器提供提示,从而生成可能更小的代码。 - Gauthier

1
使用cdecl。第二个输入会出现错误。第一个输入只是清楚地表明第二个const是指*

0
在C/C++中,你不能将整个数组作为参数传递给函数。但是,你可以通过指定数组名称而不使用索引来将指针传递给函数。
例如,以下程序片段将i的地址传递给func1()函数:
int main(void)
{
int i[10];
func1(i);
.
.
.
}

为了接收i,可以定义一个名为func1()的函数

void func1(int x[]) /* unsized array */
{
.
.
}

或者

void func1(int *x) /* pointer */
{
.
.
}

或者

void func1(int x[10]) /* sized array */
{
.
.
}

来源:完全参考 - 赫伯特。


这并没有回答问题。我想要一个不可变的数组指针,你提供的函数原型都是可变数据和指针。 - Matt Clarkson

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