如何在C中定义数组类型并使其成为const指针(不是指向const的指针)

时间:2013-11-07 08:54:06

标签: c arrays typedef c99

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

typedef int array_t[123];

然而,这不是声明

void someFunction(array_t myArray)

的常量

myArray=0;

在函数内被禁止,但

myArray[0]=0;

是允许的。

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

3 个答案:

答案 0 :(得分:5)

无论如何,你永远不能分配给数组变量。当数组衰减到指针时,只要它没有衰减它就没有指针,所以你不能分配给它。

如果要将所有数组设置为特定值,请使用memset,或者如果要复制其他数组,请使用memcpy


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

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

void someFunction(int * const myArray);

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

答案 1 :(得分:1)

C99确实引入了通过“array”语法

声明常量指针参数的语法
void foo(int a[const 123]) /* same as `int *const a` */
{
  a = NULL; // ERROR
}

正如您在上面的示例中所看到的,const必须放在[]内。

但是,通过对数组类型使用const声明,typedef无法“提前”嵌入到数组类型中。它只能直接用在功能参数列表中。

答案 2 :(得分:0)

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

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

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

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

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