0

我知道我可以在 C 中定义数组类型,如下所示:

typedef int array_t[123];

然而,这并没有做出声明

void someFunction(array_t myArray)

在某种意义上是恒定的

myArray=0;

在函数内部是被禁止的,但是

myArray[0]=0;

被允许。

有没有办法做到这一点?如果我在类型定义或参数声明中添加“const”,我最终会得到相反的行为,其中数组元素是常量,但数组指针本身是可变的。

4

3 回答 3

5

无论如何,您永远不能分配给数组变量。虽然数组衰减为指针,但只要它没有衰减,它就不是指针,所以你不能分配给它。

如果要将所有数组设置为特定值,请使用memset,或者如果您想复制另一个数组,请使用memcpy


编辑后。这里要记住的重要一点是,如果您将它作为参数传递,那么它将作为指针而不是数组传递。

您可以做的是将参数声明为常量指针而不是指向常量的指针。

void someFunction(int * const myArray);

然后你仍然可以修改元素,但你不能改变实际的指针。

于 2013-11-07T08:57:18.400 回答
1

C99 确实引入了通过“数组”语法声明常量指针参数的语法

void foo(int a[const 123]) /* same as `int *const a` */
{
  a = NULL; // ERROR
}

正如你在上面的例子中看到的,const必须放在[].

但是,const不能通过使用数组类型的typedef声明“提前”将其嵌入到数组类型中。只能在函数参数列表中直接使用。

于 2013-11-07T09:16:23.270 回答
0

如果你绝对需要一个typedef,使用 struct 来封装它。在数组上使用typedef不是一个好主意。

typedef struct {
    int arr[123];
} array_t;

然后你可以按照 Joachim Pileborg 的建议做const

void someFunction(array_t * const myArray)
{
    myArray->arr[0] = ...

这种方法的另一个优点是您还可以使用您的对象传输其他数据。

于 2013-11-07T09:27:58.893 回答