函数参数传递1——非引用形参

本文深入探讨函数参数传递机制,特别是指针与const形参的作用及影响。解释如何使用指针形参修改实参指向的对象而不改变实参本身,并讨论const形参在函数调用过程中的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每次调用函数时,都会重新创建函数的所有形参,此时传递的实参将初始化形参。形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参值;如果形参为引用类型,则它只是实参的另一个名字。

***非引用形参***

普通的非引用形参通过复制对应实参的值实现初始化。当实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会影响到实参的值。

1、指针形参

void rest(int *ip)
{  *ip = 0;//更改了指向值  
      ip =0;// 不会更改实参本身
}


指针形参调用过程中不会修改指针实参本身,但可以通过指针修改所指向的对象,如果要保障指针所指向的值,则形参需定义为指向const对象的指针。

void user_ptr(const int* p){  ///////}```


指针形参是指向const类型还是非const类型,将影响函数调用所使用的实参。我们既可以用int* 也可以用const int* 类型实参调用user-per函数;但只能用int* 类型的实参传递给rest();

这个差别源之于指针初始化规则:可以将const对象的指针初始化为非const对象,但不可以将非const对象的指针指向const对象。


2、const形参

调用函数时,如果函数使用非引用非const形参,则既可以给函数传递const实参也可以传递非const实参。例如:

const int i =3,j = 6;
int k = rgcd(i,j);
这是因为函数使用的只是实参的副本不涉及 实参本身的修改 故既可以是非const 也可以是const;


如果实参是非引用的const类型:

viod fcn(const int i);

则在函数中不可以改变实参的局部副本,由于实参是以副本传递给形参的故即可以传递const对象也可以是非const对象。 因为无论什么值都不会被修改,就都可以传递了。

复制实参有其局限性,以下几种不适合

1、当需要在函数中修改实参时

2、当传递大型对象时复制实参开销太大

3、没有办法实现对象复制时以上几种情况,有效解决办法是将形参定义为引用或指针类型。

### 函数参数传递方式概述 函数参数传递是指在程序设计中,当调用一个函数如何将数据从调用者传递给被调用者的机制。不同的编程语言可能支持不同的参数传递方式,这些方式主要包括值传递引用传递、指针传递以及可变数量的参数传递等。 #### 值传递 在这种方式下,实参的数据会被复制一份并赋值给形参。因此,在函数内部对形参所做的任何修改都不会影响到原始变量[^1]。这种方式适用于不需要改变原数据的情况。 #### 引用传递 与值传递相反,引用传递不会创建新的副本而是直接操作原来的对象。这意味着如果在函数体内改变了该参数,则外部对应的实体也会受到影响。这种方法通常用于需要更新输入或者处理大型数据结构以节省内存开销的情形之下。 #### 指针传递 (主要针对C/C++) 对于某些低级语言如C++, 可能会采用指针作为媒介来进行间接访问目标地址上的内容从而实现类似于引用的效果。不过需要注意的是, 使用不当可能导致野指针等问题所以要格外小心管理生命周期等方面的事情. #### Python中的特殊情形 - 不定长参数 除了上述常规手段之外,PYTHON还提供了另外一种灵活的选择即允许定义接收任意数目参数的方法. 这可以通过前缀单星号(*)来标记相应位置参数将会被打包成元组(tuple), 而双星号(**)则对应关键字参数字典(dictionary)[^3]. #### Java 的情况分析 关于JAVA而言, 它采取了一种独特的策略称为"按值调用(Call by Value)", 即使表面上看起来像是操纵着对象本身但实际上还是基于拷贝后的引用值进行工作的原理.[^4] ```java public class Main { public static void main(String[] args){ int a=5; increment(a); System.out.println(a); // 输出仍为5 } private static void increment(int num){ num +=10; } } ``` 在这个例子当中尽管我们在increment()方法里增加了num数值大小但是由于只是局部作用域内的变化故而最终打印出来的结果并没有发生预期的变化. ### 结论 综上所述每门特定的语言都有其专属的规定去决定到底应该怎样完成这项任务——即将必要的资料安全有效地送达到目的地的同又能保持整个系统的稳定性不受破坏.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值