打印
[应用相关]

C语言规则很简单:所有参数都是"传值调用"

[复制链接]
1004|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LOVEEVER|  楼主 | 2024-9-13 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言所有函数的参数都是以"传值调用"的方式进行传递,这意味着函数将获得参数值的一份拷贝。这样函数可以放心地修改这个拷贝值,而不用担心修改调用程序实际传给它的参数。

C语言规则很简单:所有参数都是"传值调用"

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

数组参数的这种行为似乎与传值调用规则相悖,但是此处并无矛盾---数组名(的值)实际上是一个指针,传递给函数的就是这个指针的一份拷贝,下标引用实际上是间接访问的另一种形式,它可以对指针执行间接访问操作,访问指针指向的内存位置。

当一个数组名作为参数传递给一个函数时会发生什么情况呢?你现在已经知道数组名的值就是一个指向数组第一个元素的指针,所以很容易明白此时传递给函数的是一份该指针的拷贝。函数如果执行下标引用,实际上是对这个指针执行间接访问操作,并且通过这种间接访问,函数可以访问和修改调用该程序的数组元素。

那么数组的传值调用行为有时表现在什么地方呢?传递给函数的是参数的一份拷贝(指向数组起始位置的指针的拷贝),所以函数可以自由地操作它的指针参数,而不必担心会修改对应的实参指针。

所以,此处并不存在矛盾:所有的参数都是通过传值方式传递的。当然,如果你传递了一个指向某个变量的指针,而函数对该指针执行了间接访问操作,那么函数就可以修改那个变量,尽管初看上去并不明显,但数组名作为参数时所发生的正是这种情况。这个参数(指针)实际上是通过传值方式调用,函数得到的是该指针的一份拷贝。



如果你想把一个数组名作为参数传递给函数,正确的函数形参是怎样的?它是应该声明为一个指针还是一个数组?

正如你所看到的那样,调用函数时实际传递的是一个指针拷贝,所以,函数的形参实际上是一个指针,但为了程序员新手更容易上手,编译器也接受数组形式的函数形参。因此,下面两个函数原型是相等的:

int strlen(char *string);

int strlen(char string[]);

你可以使用任何一种声明,但哪个"更加准确"呢?答案是指针。因为实参实际上是个指针,而不是数组。同样,在这里表达式sizeof string的值是指向字符的指针的长度,而不是数组的长度。
链接原文:[url]https://mp.weixin.qq.com/s/DCeQdUnUcGTGbq6Otjp7P 如有侵权,请联系删除。

使用特权

评论回复
沙发
呈兴| | 2024-9-20 22:54 | 只看该作者
这样函数可以放心地修改这个拷贝值

使用特权

评论回复
板凳
ym0sly| | 2024-9-23 18:51 | 只看该作者
所以,此处并不存在矛盾:所有的参数都是通过传值方式传递的

使用特权

评论回复
地板
szt1993| | 2024-9-23 19:11 | 只看该作者
调用函数时实际传递的是一个指针拷贝

使用特权

评论回复
5
csv7k1| | 2024-9-29 22:40 | 只看该作者
这样函数可以放心地修改这个拷贝值,而不用担心修改调用程序实际传给它的参数

使用特权

评论回复
6
在水一方00| | 2024-9-30 23:56 | 只看该作者
不用担心修改调用程序实际传给它的参数

使用特权

评论回复
7
o88ne| | 2024-10-2 21:06 | 只看该作者
这样函数可以放心地修改这个拷贝值

使用特权

评论回复
8
1988020566| | 2024-10-11 22:22 | 只看该作者
当传递基本数据类型(如int、float、double等)时,函数接收的是这些值的一个副本。因此,在函数内部对这些值的任何修改都不会影响原始的变量。

使用特权

评论回复
9
Stahan| | 2024-10-13 21:00 | 只看该作者
传值会不会增加资源占用啊

使用特权

评论回复
10
belindagraham| | 2024-10-15 12:34 | 只看该作者
数组名在大多数情况下会被视为指向数组首元素的指针。

使用特权

评论回复
11
mattlincoln| | 2024-10-15 15:44 | 只看该作者
尽管指针本身是通过值传递的,但由于指针指向的是原始数据的地址,所以在函数内部通过指针进行的修改会影响到原始数据。

使用特权

评论回复
12
plsbackup| | 2024-10-17 09:39 | 只看该作者
当参数是指针时。在C语言中,函数参数默认是通过值传递的,这意味着函数接收的是实参的副本,而不是实参本身。因此,函数内部对参数的任何修改都不会影响到原始实参。

使用特权

评论回复
13
saservice| | 2024-10-18 12:37 | 只看该作者
C语言中的函数参数传递是通过值传递的,但是通过传递指针,可以在函数内部修改调用函数中的实际数据。

使用特权

评论回复
14
gygp| | 2024-10-20 13:55 | 只看该作者
对于大型数据结构,复制整个结构可能会导致性能下降。

使用特权

评论回复
15
sesefadou| | 2024-10-20 15:49 | 只看该作者
当参数是指针时,传递的是指针变量的值(即内存地址),而不是指针所指向的数据的拷贝。因此,通过指针参数,函数可以访问和修改调用者提供的实际数据。

使用特权

评论回复
16
suncat0504| | 2024-10-20 21:42 | 只看该作者
传值和传地址各有各的好处。只不过传地址的一定要处理好整个处理过程,否则很容易出现奇怪的结果。

使用特权

评论回复
17
cemaj| | 2024-10-21 09:41 | 只看该作者
C语言中函数参数的传递方式可以总结为“传值调用”,但这个“值”可以是原始数据的值,也可以是数据的地址(指针)。函数内部对参数的修改是否会影响到函数外部的变量,取决于参数的类型以及它是如何被传递的。

使用特权

评论回复
18
elsaflower| | 2024-10-21 11:37 | 只看该作者
函数内部对参数的任何修改都只会影响这个副本,而不会影响原始变量。

使用特权

评论回复
19
ccook11| | 2024-10-21 14:13 | 只看该作者
这是C语言中的一个重要特性,它允许函数既能保护原始数据不被意外修改,也能在需要时修改数据。

使用特权

评论回复
20
sdlls| | 2024-10-23 20:02 | 只看该作者
指针作为函数参数时也可以实现类似传址调用的效果,函数可以通过指针修改指针所指向的变量的值。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

291

主题

1900

帖子

4

粉丝