按数值传递一个数组到一个函数
下面是C编程只是常见问题的一个片段。 这是不是错误的数组不能通过引用传递?
八.6:如何通过值传递一个数组到一个函数?
答案:可以通过在被调用的函数中声明带有方括号(
[
和]
)的数组名来在数组中传递数组。 调用该函数时,只需将该数组的地址(即数组的名称)传递给被调用的函数。 例如,以下程序通过值将数组x[]
传递给名为byval_func()
的函数:
int[]
参数告诉编译器byval_func()
函数将接受一个参数 – 一个整数数组。 当byval_func()
函数时,将数组的地址传递给byval_func()
:byval_func(x);
因为数组是按值传递的,所以数组的一个精确的拷贝被放在堆栈上。 被调用的函数然后接收这个数组的拷贝并且可以打印它。 因为传递给
byval_func()
的数组是原始数组的副本,所以在byval_func()
函数内修改数组对原始数组没有影响。
因为数组是按值传递的,所以数组的一个精确的拷贝被放在堆栈上。
这是不正确的: 数组本身不被复制 ,只有指向其地址的指针副本被传递给被调用者(被放置在堆栈上)。 (无论你将参数声明为int[]
还是int*
,它将衰变为一个指针) 。 这允许你从被调用函数中修改数组的内容 。 因此,这一点
因为传递给byval_func()的数组是原始数组的副本,所以在byval_func()函数内修改数组对原始数组没有影响。
显然是错误的(对@Jonathan Leffler的评价如下)。 但是,重新分配函数内的指针不会将指针更改为函数外的原始数组。
烧那本书 如果你想要一个不是初学者程序员写的真正的C FAQ,请使用这个: http : //c-faq.com/aryptr/index.html 。
语法方面,严格来说,您不能通过C中的值传递数组
void func (int* x); /* this is a pointer */ void func (int x[]); /* this is a pointer */ void func (int x[10]); /* this is a pointer */
然而 ,logging在C中有一个肮脏的伎俩,它允许你在C中通过一个数组来传递数据。不要在家里试试这个! 因为尽pipe这个技巧,仍然没有理由通过价值传递数组。
typedef struct { int my_array[10]; } Array_by_val; void func (Array_by_val x);
在C和C ++中,不可能将一个完整的内存块作为parameter passing给一个函数,但是我们可以传递它的地址。 在实践中,这具有几乎相同的效果,并且是更快和更高效的操作。
为了安全起见,你可以在指针之前传递数组大小或者把const限定符,以确保被调用者不会改变它。
#include<stdio.h> void fun(int a[],int n); int main() { int a[5]={1,2,3,4,5}; fun(a,5); } void fun(int a[],int n) { int i; for(i=0;i<=n-1;i++) printf("value=%d\n",a[i]); }
通过这个方法,我们可以通过值来传递数组,但实际上数组是通过其实际上在堆栈中复制的基地址来访问的。