鱼C论坛

 找回密码
 立即注册
查看: 1063|回复: 4

[已解决]c语言函数参数传递问题

[复制链接]
发表于 2023-8-10 11:37:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
c语言什么样的参数传入函数在函数结束后会被修改?
比如通过数组名传入函数后,原数组会被修改。
char *a[]这种字符串通过串名a传入后会不会被修改?
能做个总结吗?
最佳答案
2023-8-10 11:38:06
在 C 语言中,函数参数传递可以分为两种方式:按值传递(传值)和按引用传递(传址)。

1. 按值传递(传值):
   · 基本数据类型(如 int、float、char),数组名、指针都是按值传递。
   · 当将基本数据类型、数组名或指针作为函数的参数传递时,在函数内部对参数进行修改不会影响到原始的变量或数组。因为在函数调用时,实际参数的值会被复制到函数的形式参数中,函数对形式参数的修改不会影响到实际参数。

2. 按引用传递(传址):
   · 如果想要函数内部对参数的修改能够影响到原始的变量,可以使用指针或引用作为函数的参数传递。这样就可以通过修改指针所指向的内存地址或引用所绑定的对象来修改原始变量。
   · 字符串是以字符数组或字符指针的形式存在,通过数组名或指针传入函数时,实际上是将数组名或指针的地址作为参数传递给函数,函数内部可以通过这个地址来修改原始数组或字符串。

总结:
· 基本数据类型和数组名作为参数传递给函数时,是按值传递的,函数中对参数的修改不会影响到原始的变量或数组。
· 数组作为参数传递给函数时,实际上传递的是数组的地址,函数可以通过指针来修改原始数组的内容。
· 字符串以字符数组或字符指针的形式存在,当使用字符数组名或字符指针作为参数传递给函数时,实际上传递的是数组名或指针的地址,函数可以通过修改指针所指向的内存地址或数组元素来修改原始字符串。

对于 char *a[] 这种形式的字符串数组,当将其作为参数传递给函数时,实际上传递的是数组名的地址,函数内部可以通过指针来修改原始的字符串数组。所以,通过 char *a[] 形式传入函数后,原数组会被修改。但需要注意的是,在函数中修改了指针数组的元素,即修改了指针指向的字符串内容,但并不会改变指针本身的指向(即指针数组中的元素仍然指向原来的字符串)。如果在函数中修改了指针本身,如将指针指向其他字符串,那么原数组的指针元素也会发生改变。

希望以上解释能够解决你的疑问。如果有任何问题,请随时追问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-10 11:38:00 | 显示全部楼层
在C语言中,函数参数传递方式有两种:按值传递和按引用传递。按值传递是指将参数的值复制一份传递给函数,在函数内部对参数的修改不会影响到原来的值。而按引用传递是指将参数的地址传递给函数,函数内部对参数的修改会影响到原来的值。

对于数组类型的参数,无论是通过数组名还是通过指针传递,都是按引用传递的方式。这意味着在函数内部对数组的修改会影响到原数组。因此,通过数组名传入函数后,原数组会被修改。

对于字符串类型的参数,C语言中的字符串是以字符数组的形式表示的,可以通过数组名或者指针传递给函数。当以字符数组的形式传递时,也是按引用传递的方式,所以原字符串会被修改。而当以指针的形式传递时,虽然指针本身是按值传递的,但是通过指针可以修改字符串的内容,因此原字符串也会被修改。

综上所述,通过数组名或者指针传递的参数,在函数结束后会被修改。而其他类型的参数,如基本数据类型和结构体等,都是按值传递的方式,函数内部对参数的修改不会影响到原来的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-10 11:38:06 | 显示全部楼层    本楼为最佳答案   
在 C 语言中,函数参数传递可以分为两种方式:按值传递(传值)和按引用传递(传址)。

1. 按值传递(传值):
   · 基本数据类型(如 int、float、char),数组名、指针都是按值传递。
   · 当将基本数据类型、数组名或指针作为函数的参数传递时,在函数内部对参数进行修改不会影响到原始的变量或数组。因为在函数调用时,实际参数的值会被复制到函数的形式参数中,函数对形式参数的修改不会影响到实际参数。

2. 按引用传递(传址):
   · 如果想要函数内部对参数的修改能够影响到原始的变量,可以使用指针或引用作为函数的参数传递。这样就可以通过修改指针所指向的内存地址或引用所绑定的对象来修改原始变量。
   · 字符串是以字符数组或字符指针的形式存在,通过数组名或指针传入函数时,实际上是将数组名或指针的地址作为参数传递给函数,函数内部可以通过这个地址来修改原始数组或字符串。

总结:
· 基本数据类型和数组名作为参数传递给函数时,是按值传递的,函数中对参数的修改不会影响到原始的变量或数组。
· 数组作为参数传递给函数时,实际上传递的是数组的地址,函数可以通过指针来修改原始数组的内容。
· 字符串以字符数组或字符指针的形式存在,当使用字符数组名或字符指针作为参数传递给函数时,实际上传递的是数组名或指针的地址,函数可以通过修改指针所指向的内存地址或数组元素来修改原始字符串。

对于 char *a[] 这种形式的字符串数组,当将其作为参数传递给函数时,实际上传递的是数组名的地址,函数内部可以通过指针来修改原始的字符串数组。所以,通过 char *a[] 形式传入函数后,原数组会被修改。但需要注意的是,在函数中修改了指针数组的元素,即修改了指针指向的字符串内容,但并不会改变指针本身的指向(即指针数组中的元素仍然指向原来的字符串)。如果在函数中修改了指针本身,如将指针指向其他字符串,那么原数组的指针元素也会发生改变。

希望以上解释能够解决你的疑问。如果有任何问题,请随时追问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-10 11:38:06 | 显示全部楼层
参数传递问题的总结

在 C 语言中,参数传递可以分为值传递和引用传递两种方式。不同的参数传递方式对于函数结束后原参数的修改行为是不同的。

1. 值传递:基本数据类型(如整型、浮点型、字符型等)以及结构体等大的数据对象通常是通过值传递的方式传入函数的。在函数内部对形参的修改不会影响到原来的实参值。

2. 引用传递:通过指针或引用传递参数时,函数可以修改实参的值。这种方式使用较多,常见的有以下情况:
   - 指针传递:如果传入函数的参数是指针类型(如int*char*等),那么函数内部通过修改指针所指向的内存区域可以改变原始数据。
   - 数组传递:数组名作为函数参数时,实际上传递的是数组的地址,函数内部对数组元素的修改会影响到原数组。
   - 引用传递:C++ 中支持引用传递,通过声明函数参数为引用类型,可以实现对实参的修改。

对于 char *a[] 类型的参数,它是一个字符串数组,传入函数时实际上传递的是字符串数组的首地址,即数组名的地址。因此,在函数内部通过该指针可以修改原字符串数组中的内容,但无法修改数组的大小。

总结起来:
- 值传递不会修改原始数据。
- 引用传递可以修改原始数据,包括指针传递、数组传递和引用传递(C++)。

希望以上回答对你有帮助!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-10 22:49:06 | 显示全部楼层
学习了哟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 07:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表