C:为什么可以按值传递(给函数)结构体,而不是数组?

Dav*_*eli 4 c arrays struct pass-by-value

这背后有什么历史或逻辑原因吗?


解释:当您将数组传递给 C 中的函数时,您实际上只传递了一个指向数组的指针。但是,当您传递结构时,您可以传递结构的副本或指针。

//this:
int function(int array[10])
// is equivalent to this:
int function(int *array)
//and they both pass a pointer

//but this:
int function(struct tag name)
//passes a struct by value, where as this:
int function(struct tag *name)
//passes a pointer to it.
Run Code Online (Sandbox Code Playgroud)

为什么会有差异?

Jam*_*den 5

在最初的 K&R 中,您不能按值传递结构。那是一个语法错误。由于许多编译器供应商将其作为扩展提供,因此按值传递最终进入了标准。

为什么要限制,为什么要进化?开发 C 的机器很小。64 KB 的段大小很常见。内存很宝贵,既然可以传递地址,为什么还要复制呢?在堆栈上复制 64 字节结构一个错误,甚至可能不是用户想要的。

到 1990 年代中期,这不再是事实。32 位寻址和 4 MB 或更大的 RAM 很常见。该限制是一个障碍并导致了一些复杂性,因为如果没有const通过引用传递的结构,可能会在不知不觉中被修改。

为什么不对数组做同样的事情?没有要求。如您所知,数组和指针在 C 中密切相关。C 标准库在很大程度上依赖于通过引用传递,考虑memsetstrcpy。虽然按值传递结构意味着只是删除&调用,但按值传递数组将需要添加新语法。提供by valueC 语法的编译器供应商会被会议嘲笑。