能否用数组符号声明常量指针类型的函数参数?
问题解答
可以实现。核心是明确修饰函数参数中的指针本身为常量,同时保留数组符号的写法。
原理说明
C语言中,函数参数列表里的int array[]本质是int* array的语法糖——数组类型会自动退化为指向元素的指针。默认这个指针是可赋值的,要让它变成不能被重新赋值的常量指针,需要给指针本身加上const修饰。
两种实现方式
方式1:明确声明为常量指针(兼容所有C标准)
直接把参数写成int *const array,虽然看起来是指针写法,但完全等价于用[]声明的语义,同时限制了指针本身的赋值:
void bar(int *const array) { static int temp[] = { 1, 2, 3 }; array = temp; // 编译错误:常量指针无法被赋值,符合需求 }
方式2:保留[]符号(C99及以后支持)
如果你坚持要用数组方括号的写法,可以用int array[const],这是C99引入的语法,会被编译器解析为int* const array,效果完全一致:
void bar(int array[const]) { static int temp[] = { 1, 2, 3 }; array = temp; // 同样触发编译错误 }
注意区分概念
别混淆两种const的位置:
const int array[]:等价于const int* array,限制的是不能通过指针修改数组元素,指针本身仍可赋值;int *const array/int array[const]:限制的是指针本身不能被重新赋值,但仍可通过指针修改数组元素,这正是你需要的效果。
内容的提问来源于stack exchange,提问作者abelenky
相关产品推荐
相关产品推荐

