数组作为函数参数退化为指针是否违反C99标准的左值规定?
问题解答
首先得明确两个核心场景的区别,你混淆的是「数组表达式的隐式转换」和「函数参数的类型调整」这两个完全不同的规则:
函数参数的类型调整规则
你提到的三种函数定义等价,本质是C标准的强制规定:当函数参数被声明为数组类型时(不管是int array[]还是int array[3]),编译器会直接将其调整为对应的指针类型(也就是int* array)。
换句话说,函数里的array从一开始就是一个指针类型的局部变量,它不是「数组退化成指针」的结果——它本身就是指针,所以它是左值是完全合理的,你可以给它赋值(比如array = NULL;),这和C99的规定没有关系。C99规定针对的场景
你引用的那条C99规则,约束的是数组类型的表达式的隐式转换行为,比如你在函数调用时传递数组实参的场景:int arr[5]; test(arr); // 这里的arr是数组表达式,会被转换为指针这里的
arr作为数组表达式,除了sizeof、&运算符或者字符串初始化的情况,会被转换为指向首元素的指针,而且这个转换后的指针不是左值——你不能写arr = &arr[1];,因为这个转换结果不能被赋值,这才是那条规则管的范围。
简单来说:函数参数里的array是天生的指针变量(左值),而数组表达式转成的指针是临时的非左值,两者场景完全不同,不存在违反标准的情况。
内容的提问来源于stack exchange,提问作者mzoz
相关产品推荐
相关产品推荐

