You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组作为函数参数退化为指针是否违反C99标准的左值规定?

问题解答

首先得明确两个核心场景的区别,你混淆的是「数组表达式的隐式转换」和「函数参数的类型调整」这两个完全不同的规则:

  1. 函数参数的类型调整规则
    你提到的三种函数定义等价,本质是C标准的强制规定:当函数参数被声明为数组类型时(不管是int array[]还是int array[3]),编译器会直接将其调整为对应的指针类型(也就是int* array)。
    换句话说,函数里的array从一开始就是一个指针类型的局部变量,它不是「数组退化成指针」的结果——它本身就是指针,所以它是左值是完全合理的,你可以给它赋值(比如array = NULL;),这和C99的规定没有关系。

  2. C99规定针对的场景
    你引用的那条C99规则,约束的是数组类型的表达式的隐式转换行为,比如你在函数调用时传递数组实参的场景:

    int arr[5];
    test(arr); // 这里的arr是数组表达式,会被转换为指针
    

    这里的arr作为数组表达式,除了sizeof、&运算符或者字符串初始化的情况,会被转换为指向首元素的指针,而且这个转换后的指针不是左值——你不能写arr = &arr[1];,因为这个转换结果不能被赋值,这才是那条规则管的范围。

简单来说:函数参数里的array是天生的指针变量(左值),而数组表达式转成的指针是临时的非左值,两者场景完全不同,不存在违反标准的情况。

内容的提问来源于stack exchange,提问作者mzoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:02:45