我知道我可以在C中定义数组类型,如下所示:
typedef int array_t[123];
然而,这不是声明
void someFunction(array_t myArray)
的常量
myArray=0;
在函数内被禁止,但
myArray[0]=0;
是允许的。
有没有办法实现这个目标?如果我在类型定义或参数声明中添加“const”,我最终会得到反向行为,其中数组元素是常量,但数组指针本身是可变的。
答案 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] = ...
此方法的另一个优点是您还可以使用您的对象传输其他数据。