通过值将数组传递给函数

以下是C编程Just FAQs一书的摘录。这不是错误的吗,因为数组永远不能通过引用传递?

VIII.6:如何通过值将数组传递给函数?

答:可以通过在调用的函数中声明数组名称[]在其末尾加上方括号(和)的方式,将数组按值传递给函数。调用函数时,只需将数组的地址(即数组的名称)传递给被调用的函数。例如,以下程序将数组传递给以 值x[]命名 byval_func()的函数:

int[]参数告诉编译器该byval_func() 函数将采用一个参数-整数数组。byval_func()调用该 函数时,将数组的地址传递给 byval_func()

byval_func(x);

因为该数组是按值传递的,所以将制作该数组的精确副本并将其放置在堆栈中。然后,被调用函数将接收该数组的副本并进行打印。因为传递给的数组 byval_func()是原始数组的副本,所以在byval_func()函数中修改数组对原始数组没有影响。


万千封印
浏览 494回答 3
3回答

慕田峪7331174

因为该数组是按值传递的,所以将制作该数组的精确副本并将其放置在堆栈中。这是不正确的:不复制数组本身,仅将指向其地址的指针的副本传递给被调用方(放置在堆栈上)。(无论您将参数声明为int[]还是int*,它都会衰减为指针。)这使您可以从被调用函数内部修改数组的内容。因此,这因为传递给byval_func()的数组是原始数组的副本,所以在byval_func()函数中修改该数组对原始数组没有影响。是完全错误的(对@Jonathan Leffler在下面的评论表示赞赏)。但是,在函数内部重新分配指针不会将指针更改为函数外部的原始数组。

不负相思意

在C和C ++中,无法通过值将完整的内存块作为参数传递给函数,但允许我们传递其地址。在实践中,这几乎具有相同的效果,并且是更快,更有效的操作。为了安全起见,您可以传递数组大小或将const限定符放在指针之前,以确保被调用者不会对其进行更改。
打开App,查看更多内容
随时随地看视频慕课网APP