Zuz*_*uzu 36 c arrays pass-by-reference pass-by-value
以下是C Programming Just the FAQs一书的摘录.这不是错误的,因为Arrays永远不能通过引用传递吗?
VIII.6:如何通过值将数组传递给函数?
答案:通过在被调用函数中声明带有方括号(
[
和]
)的数组名称,数组可以按值传递给函数.调用函数时,只需将数组的地址(即数组的名称)传递给被调用的函数即可.例如,以下程序将数组传递x[]
给byval_func()
value 命名 的函数:该
int[]
参数告诉编译器该byval_func()
函数将采用一个参数 - 一个整数数组.byval_func()
调用该 函数时,将数组的地址传递给byval_func()
:Run Code Online (Sandbox Code Playgroud)byval_func(x);
由于数组是按值传递的,因此会生成数组的精确副本并将其放在堆栈中.然后被调用的函数接收该数组的副本并可以打印它.因为传递给的数组
byval_func()
是原始数组的副本,所以修改byval_func()
函数中的数组对原始数组没有影响.
Pét*_*rök 60
由于数组是按值传递的,因此会生成数组的精确副本并将其放在堆栈中.
这是不正确的:数组本身没有被复制,只有指向其地址的指针的副本被传递给被调用者(放在堆栈上).(无论是否将参数声明为int[]
或int*
,它都会衰减为指针.)这允许您从被调用函数中修改数组的内容.因此,这
因为传递给byval_func()的数组是原始数组的副本,所以在byval_func()函数中修改数组对原始数组没有影响.
是完全错的(感谢@Jonathan Leffler对他的评论如下).但是,在函数内重新分配指针不会更改指向函数外部原始数组的指针.
Lun*_*din 52
烧那本书.如果你想要一个非初学者程序员编写的真正的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 */
Run Code Online (Sandbox Code Playgroud)
但是,为了记录,C中有一个脏技巧,它允许你在C中按值传递一个数组.不要在家里试试!因为尽管有这个技巧,仍然没有理由按值传递数组.
typedef struct
{
int my_array[10];
} Array_by_val;
void func (Array_by_val x);
Run Code Online (Sandbox Code Playgroud)