4个字解释C语言函数参数传递规则

 2024-03-17 01:10:52  阅读 0

本文为原创文章。 如需转载请附上本账号链接或联系作者。

C语言中所有函数的参数都是通过“按值调用”的方式传递的,这意味着函数会得到参数值的副本。 这样,函数就可以安全地修改复制的值,而不必担心修改调用程序实际传递给它的参数。

C语言的规则很简单:所有参数都是“按值调用”

但是,如果传递的参数是数组名,并且在函数中使用下标引用数组的参数,那么在函数中修改数组元素实际上就是修改调用程序中的数组元素。 该函数将访问调用程序的数组元素,并且不会为该数组赋值。

数组参数的这种行为似乎违反了按值调用规则,但这里并不矛盾——数组名(值)实际上是一个指针,传递给函数的是 this 的副本指针、下标引用实际上是间接访问的另一种形式。 它可以对指针进行间接访问操作,访问指针所指向的内存位置。

当数组名作为参数传递给函数时会发生什么? 现在你知道数组名的值是一个指向数组第一个元素的指针,所以很容易理解,此时传递给函数的是指针的副本。 如果函数进行了下标引用,实际上就是对这个指针进行了间接访问操作,通过这种间接访问,函数可以访问并修改调用程序的数组元素。

那么数组的按值调用行为有时会表现在哪里呢? 传递给函数的是参数的副本(指向数组开头的指针的副本),因此函数可以自由操作其指针参数,而不必担心修改相应的实际参数指针。

所以,这里并不矛盾:所有参数都是按值传递的。 当然,如果您将指针传递给变量并且函数对该指针执行间接寻址,则该函数可以修改该变量。 虽然乍一看并不明显,但是当数组名用作参数时会发生什么? 情况确实如此。 这个参数(指针)实际上是按值调用的,函数得到的是指针的副本。

如果要将数组名称作为参数传递给函数,正确的函数参数是什么? 应该将其声明为指针还是数组?

可以看到,调用函数时实际传递的是指针副本,因此函数的形参实际上也是一个指针,但是为了让新手程序员更容易上手,编译器还接受函数参数中的函数参数数组的形式。 因此,以下两个函数原型是相等的:

int(字符*);

int(char[]);

您可以使用任何一种说法,但哪一种“更准确”? 答案是指针。 因为实际参数实际上是一个指针,而不是一个数组。 同样,这里表达式的值是指向字符的指针的长度,而不是数组的长度。

什么? 还是不明白? 直接私信作者进行一对一解答。

定期以通俗易懂的方式分享嵌入式知识,关注公众号,加星星,每天进步一点点。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码