引用参数和传值参数的区别深入解析

以下是对引用参数和传值参数的区别进行了详细的分析介绍,需要的朋友可以过来参考下
 

1. 我们都知道,普通的传值参数是由行参传给实参;

编译器在函数内部为每一个参数产生一个临时变量,将每一个参数压入栈(stack)中,将实参的数值保存到临时变量中。

所以才有在低端8位机中,对参数的数量有比较严格的限制,因为栈的深度非常有限;当然,在通用机上也有同样的问题,参数过多不合适,但通用机的栈的深度比低端机大多了;

2. 引用做参数传递的是变量的地址;

实质上传递的是变量的指针;

引用作为参数的好处是减少了临时变量对内存的开销,因此常用于对大对象的操作;

而常引用做参数就是保护参数不被修改;

附:堆和栈的知识
一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)―   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) ―   一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区  ―常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区―存放函数体的二进制代码。

时间: 2024-12-28 14:00:27

引用参数和传值参数的区别深入解析的相关文章

引用参数和传值参数的区别深入解析_C 语言

1. 我们都知道,普通的传值参数是由行参传给实参: 编译器在函数内部为每一个参数产生一个临时变量,将每一个参数压入栈(stack)中,将实参的数值保存到临时变量中. 所以才有在低端8位机中,对参数的数量有比较严格的限制,因为栈的深度非常有限:当然,在通用机上也有同样的问题,参数过多不合适,但通用机的栈的深度比低端机大多了: 2. 引用做参数传递的是变量的地址: 实质上传递的是变量的指针: 引用作为参数的好处是减少了临时变量对内存的开销,因此常用于对大对象的操作: 而常引用做参数就是保护参数不被修

C++函数参数中引用和指针有什么区别?

问题描述 C++函数参数中引用和指针有什么区别? C++函数参数中引用和指针有什么区别? 解决方案 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能

深入剖析引用参数Ref和Out

学过C/C++的人,对C#的关键字Ref和Out应该都很好理解.它们都提供了一种可以在被调用函数内修改传递的参数的值的方法.因为这一功能很类似C/C++的指针.对于没学过C/C++的,也应该可以明白这两个参数的作用. 虽然Ref和Out都提供了修改参数值的方法,但它们还是有一点点小的区别.1.Ref在作为参数调用函数之前,变量一定要赋值,否则会得到一个常规编译错误:使用了未赋值的变量.2.在被调用函数内,以Ref引入的参数在返回前不必为它赋值.3.Out在作为参数调用函数之前,变量可以不被赋值.

未引用参数,添加任务栏命令及其它

我看到过一些 C++ 代码针对没有使用过的参数用 UNREFERENCED_PARAMETER,例如: int SomeFunction(int arg1, int arg2) { UNREFERENCED_PARAMETER(arg2) ... } 我还看到过这样的代码: int SomeFunction(int arg1, int /* arg2 */) { ... } 你能解释它们的差别吗?哪一种用法更好? Judy McGeough 是啊!为什么呢?让我们从 UNREFERENCED_P

C#的引用参数和值参数

引用参数和值参数 在前面的函数学习中,所有函数的参数都是有值参数:在使用参数的时候把一个值传递给函数使用的一个变量.在函数中对此变量的任何修改都不会影响函数调用中指定的参数.还是举例说明比较好: static void doDouble(double mynum) { mynum *= 2; Console.WriteLine("mynum in 函数中doDouble{0}", mynum); } static void Main(string[] args) { Console.W

数据结构-抽象数据类型的定义中的“引用参数”怎么理解

问题描述 抽象数据类型的定义中的"引用参数"怎么理解 InitTriplet(&Tv1v2v3) 初始条件: 操作结果:用e值取代三元组T的第i个元素 DestroyTriplet(&T) 初始条件:三元组T已经存在. 操作结果:销毁三元组T. Get(Ti&e) 初始条件:三元组T已经存在,1<=i<=3 操作结果:用e返回三元组T的第i个元素. Put(&Tie) 初始条件:三元组T已经存在,1<=i<=3 操作结果:用e值取

myeclipse-求解!List总被提示要引用参数用@SuppressWarnings(&amp;amp;quot;unchecked&amp;amp;quot;)会影响程序运行么

问题描述 求解!List总被提示要引用参数用@SuppressWarnings("unchecked")会影响程序运行么 List list = sn.getSiteInfo(); String sitename = list.get(0).toString(); String method=request.getParameter(""method""); String stime=""2"";Strin

《从缺陷中学习C/C++》——6.14 正确使用引用参数和引用返回值

6.14 正确使用引用参数和引用返回值 从缺陷中学习C/C++代码示例 int &add(int n, int m) { n = n + m; return n; } int main() { int i = 10; int b = add(i, 1); cout << b << endl; return 0; } 现象&后果预期的输出结果是11,但实际输出的结果不确定. Bug分析add函数是一个函数引用,而add函数的返回值是形参n,形参是函数内的局部变量,函数

c++-C++里面引用参数的问题。

问题描述 C++里面引用参数的问题. 刚学C++,对引用不是很清楚.能否用这个题举例一下,谢谢 解决方案 方法1 int CalPfh1(int x, int y) { return x * x + y * y; } 方法2 void CalPfh2(int x, int y, int & z) { z = x * x + y * y; } 调用 cout << CalPfh1(3, 2) << endl; int z = 0; CalPfh2(3, 2, z); cout