繁体   English   中英

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

[英]How to define array type in C and making it a const pointer (not pointer to const)

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

typedef int array_t[123];

但是,这没有声明

void someFunction(array_t myArray)

在某种意义上说是恒定的

myArray=0;

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

myArray[0]=0;

被允许。

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

无论如何,您永远都不能分配给数组变量。 虽然数组会衰减到指针,但只要它没有衰减,它就不会指向指针,因此您无法为其赋值。

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


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

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

喜欢

void someFunction(int * const myArray);

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

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

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

如上例所示,必须将const放在[]

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

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

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

然后您可以使用const来执行Joachim Pileborg的建议:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM