C语言中数组指针的const关键字使用疑问
关于C语言函数数组形参与const指针的疑问解答
首先得明确核心差异:数组名在函数外部的特性,和它作为实参传递给函数后的处理逻辑完全不同。
1. 函数外部的数组名:确实是指向首元素的常量指针
在函数外部(比如全局数组、main函数里的局部数组),数组名arr本质等价于int * const类型——你不能修改它的指向,像arr++、arr = &arr[1]这类操作都是非法的,编译器会直接报错。这就是书中“数组名是指向数组首元素的常量指针”的准确含义。
2. 函数参数里的数组写法:被编译器转成普通指针,无常量属性
当你在函数声明里写void func(int b[])时,编译器会直接把它等价转换为void func(int *b)——这里的b是一个普通的、可修改的指针,你完全可以在函数里执行b++、b = NULL这类操作。
这是因为C语言里数组采用按值传递指针的规则:当你把数组名作为实参传给函数时,它会被隐式转换成指向首元素的普通指针(丢失了原本的常量属性),函数拿到的只是这个指针的副本,而非数组本身。
3. 为什么要用int * const array作为形参?
书中用void bubbleSort(int * const array, size_t size),目的是在函数内部还原数组名的常量特性:
- 给指针本身加上
const修饰后,array就变成了int * const类型,你不能在函数里做array++这类修改指针指向的操作,避免因误移动指针位置导致的逻辑错误。 - 而
int array[]写法虽然可读性更好,但编译器会把它转成int *array,没有指针本身的const限制,存在误操作的风险。
总结
数组名本身的常量指针特性,在作为实参传递给函数时会被“消解”——编译器把它转成普通指针。函数参数里的int * const array是手动给指针加上const限制,模拟数组名原本不可修改指向的特性;而int array[]只是语法糖,本质还是普通指针,没有这个限制。
内容的提问来源于stack exchange,提问作者Pinuz
相关产品推荐
相关产品推荐

