C语言中为何函数形参数组可赋值而局部数组赋值报错?
问题解答
核心原因是C语言存在固定的语法调整规则:
- 所有声明为数组类型的函数形参,都会被编译器隐式转换为对应的指针类型,声明时写的数组长度会被直接忽略。
你给出的代码中,func函数的形参int a[10],在编译阶段会被等价处理为int *a:
a本质是一个存储在栈上的普通int指针变量,属于可修改的左值,因此a = &x的赋值操作是完全合法的,只是让指针a重新指向了变量x的地址。
而函数内部定义的int b[10]是真实的数组类型:
C标准规定数组名是数组首元素的固定地址常量,属于不可修改的右值,不允许对数组名做整体赋值操作,因此b = &x会触发assignment to expression with array type的编译错误。
补充说明:即使你把形参写为
int a[]、int a[100]等不同形式,只要是数组类型的函数形参,最终都会被调整为对应类型的指针,不会做任何数组长度校验。
内容的提问来源于stack exchange,提问作者Divya Juhi Singh
相关产品推荐
相关产品推荐

