2012-09-15 69 views
3

我想知道为什么我们可以通过值将结构传递给C函数,但我们决不能对数组(通过地址传递)进行相同的操作。将数组和结构传递给C函数

当我学习C时,他们告诉我数组会消耗很多堆栈,所以不希望按值传递它们。

但似乎结构通常是(如果不总是)比数组更大而且更复杂的数据结构,所以这种解释现在是没有意义的我!

任何人都可以帮助尽可能多的细节?

+0

这个问题已经问在C++的上下文,但也适用于c [链接](http://stackoverflow.com/questions/7454990/why-cant-we-pass-arrays-to-function-by - 值) – Yarneo

回答

5

在C中,一个数组始终定义为一个指针数组的第一个位置,因此根据定义,当要传递一个数组的函数您正在传递它的存储器地址,因此其参考。

当你定义类型结构的变量,你分配到包含这个结构需要内存中的所有空间,如果你做出这样的:

struct a, b; 
... 
a = b; 

您是从复制所有值b转换为a,同样,当你将它传递给一个函数时,你正在将原始结构的值拷贝到栈中。这就是所谓的按值传递参数。

这是真的,你说的是你的问题。一个结构可能比阵列更复杂,但它是完全有可能将其传递作为值,并且它可以是低效率的,但不能传递通过值的阵列的原因是因为它被定义为默认的指针。

+1

1与阵列不传递到功能时“由指针定义的”,它们而衰减到指针的注释。 – 2012-09-15 21:27:12

+0

感谢Hernan对于明确的答案:) –