C语言中的裸数组类型由于主要历史原因而无法复制.因此,无法使用数组初始化数组,将数组分配给数组,按值传递数组作为参数或从函数返回数组.(初始化上下文有一个明显的例外char s[6] = "Hello";.)
如果数组包含在struct类型中,仍然可以执行上述所有操作,这表明该限制本质上是纯粹的声明性的.这没有令人信服的技术理由.
C语言继承了其历史前辈--B和BCPL语言的数组实现方法.在B/BCPL中,数组被公开实现为指针,这意味着尝试将一个数组分配给另一个数组实际上表示了指针的赋值.C语言采用了不同的方法.在C数组中不是指针,但C数组的接口规范与B/BCPL的表面保持表面兼容.在大多数情况下,C中的数组仍然"假装"成为指针.这是他们不能立即复制的一个原因.
最明显的是,"缺乏"是C不允许函数返回数组类型的结果.这在语言标准中明确说明.
在某种意义上,数组类型是C语言中的二等公民.在大多数情况下,数组类型的表达式被隐式转换为指向其第一个元素的指针.例外情况是数组表达式是sizeof(产生数组大小)的操作数,当它是一元的操作数&(产生数组的地址)时,以及它是用于初始化的初始化程序中的字符串文字数组对象.
这绝对不意味着数组是"真正的"指针; 他们不是.你会看到人们声称他们是.他们错了.
函数返回值.您可以拥有结构类型的值; 该值由其成员的值组成.C允许结构类型的赋值,参数传递和函数结果.所有这些都操纵数组值(它们通过值处理它们,而不是通过引用处理它们).
数组也是如此.我上面提到的规则意味着你不能构造一个值为数组类型的表达式.有数组值(由所有数组元素的值组成),但这些值很难或不可能直接操作.
C代码通常操作数组的方式是使用指向单个元素的指针.
设计C可能不会太困难,因此可以将固定大小的数组视为值,具有赋值,参数传递等.但是,你会遇到问题,int[10]并且int[11]是两种截然不同且不兼容的类型.处理数组的大多数C代码需要处理大小在运行时确定的数组.例如,字符串函数<string.h>处理任意长度的字符数组.它们通过使用指向数组元素的指针来实现.对于1元素,2元素,3元素等阵列,你不可能有很多不同的函数.
你可以做一个从函数返回一个数组值的等价物,但遗憾的是它很尴尬.您可以返回包含该数组的结构 - 但是必须在编译时修复该数组的大小.您可以返回指向数组(的第一个元素)的指针 - 但是您必须处理分配和释放内存以保存数组.您可以让调用者传入指向数组的指针 - 但这会给调用者带来内存管理的负担.等等.
是的,这有点乱.但处理可能大小不同的阵列确实很困难.C为您提供了执行此操作所需的所有工具,但为程序员提供了大量详细的管理.(其他语言提供数组作为一流类型.其中许多语言都有用C语言编写的编译器或解释器.)
建议阅读:comp.lang.c FAQ的第6部分.
小智 -3
虽然无法从 C 函数返回数组,但指向数组的指针可以。有关如何执行您要查找的操作的代码示例,请访问该网站:
http://www.tutorialspoint.com/cprogramming/c_return_arrays_from_function.htm