资讯专栏INFORMATION COLUMN

现代编程语言的值传递与引用传递

wenhai.he / 3653人阅读

摘要:在很多特性是和很类似,但是在类型系统中,同时支持值类型与引用类型。

现代编程语言对于值传递与引用传递的支持程度是比较不同的

首先介绍值传递与引用传递的概念

值传递

将变量a传递到其他的函数并对其更改,不能影响a的值

引用传递

在其他的作用域对传入的变量a的更改可以影响a的值

Note:

​ 在这里的值的概念,对于原始类型,指的就是字面的值,如1,2,"a";

​ 而对于动态内存分配/类,则指的是指向这个分配内存/类的引用,而非解引用后指向的内存/类所保存的值

C语言

C语言本身只支持值传递,但是通过指针这一概念,通过解引用可以达到引用传递的效果

C++

作为C语言的超集发展起来的语言,C++支持C语言的值传递与指针传递,同时C++还添加了引用传递(某种意义上是指针的语法糖),所以C++实际上通过两种语法支持引用传递

下面演示C/C++的值传递与引用传递

</>复制代码

  1. #include
  2. #include
  3. #include
  4. using namespace std;
  5. /// 基础类型热引用
  6. void swap_ref(int &a, int &b) {
  7. int t = a;
  8. a = b;
  9. b = t;
  10. }
  11. /// 类的引用
  12. void swap_ref(string &a, string &b) {
  13. string t = a;
  14. a = b;
  15. b = t;
  16. }
  17. /// 值传递
  18. void swap_val(int a, int b) {
  19. int t = a;
  20. a = b;
  21. b = t;
  22. }
  23. /// 类的值传递
  24. void swap_val(string a, string b) {
  25. string t = a;
  26. a = b;
  27. b = t;
  28. }
  29. /// 基于指针进行引用传递
  30. void swap_ptr(int *a, int *b) {
  31. int t = *a;
  32. *a = *b;
  33. *b = t;
  34. }
  35. void swap_ptr(string *a, string *b) {
  36. string t = *a;
  37. *a = *b;
  38. *b = t;
  39. }
  40. int main() {
  41. int a = 1;
  42. int b = 2;
  43. swap_ref(a, b);//引用传递
  44. printf("%d %d
  45. ", a, b);
  46. swap_val(a, b);//值传递
  47. printf("%d %d
  48. ", a, b);
  49. string x = "x", y = "y";
  50. swap_ref(x, y);//引用传递
  51. cout << x << " " << y << endl;
  52. swap_val(x, y);//值传递 无效果
  53. cout << x << " " << y << endl;
  54. /// rief 使用指针本身进行值传递 通过解引用达到了解引用的效果
  55. swap_ptr(&a, &b);//通过指针引用传递
  56. printf("%d %d
  57. ", a, b);
  58. swap_ptr(&x, &y);//指针的引用传递
  59. cout << x << " " << y << endl;
  60. return 0;
  61. }

</>复制代码

  1. $ ./main.exe
  2. 2 1
  3. 2 1
  4. y x
  5. y x
  6. 1 2
  7. x y

Notes:

使用指针可以改变其指向的对象的值,但是其无法改变其指针自己的值,如果想改变指针指向的对象,如果想在其他函数改变指针的值,只能取这个指针的指针,这又回到了swap这个问题

Java

Java可能是处于控制语言的复杂度的考虑,只支持值传递。

同样的还有Python

</>复制代码

  1. public class type {
  2. public static void main(String[] args) {
  3. String s = "One String";
  4. System.out.println(s);
  5. changeString(s);
  6. System.out.println(s);
  7. }
  8. public static void changeString(String s) {
  9. s = "Yet Another String";
  10. }
  11. }
C

C#在很多特性是和Java很类似,但是在类型系统中,C#同时支持值类型与引用类型。

</>复制代码

  1. namespace ConsoleApp1
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. int a = 1, b = 2;
  8. swap(ref a, ref b);
  9. Console.WriteLine($"a = {a} b = {b}");
  10. swap(a, b);
  11. Console.WriteLine($"a = {a} b = {b}");
  12. string x = "x-ray", y = "y-ray";
  13. swap(ref x, ref y);
  14. Console.WriteLine($"x = {x} y = {y}");
  15. swap(x, y);
  16. Console.WriteLine($"x = {x} y = {y}");
  17. }
  18. private static void swap(int a, int b)
  19. {
  20. int t = a;
  21. a = b;
  22. b = t;
  23. }
  24. private static void swap(ref int a, ref int b)
  25. {
  26. int t = a;
  27. a = b;
  28. b = t;
  29. }
  30. private static void swap(string a, string b)
  31. {
  32. string t = a;
  33. a = b;
  34. b = t;
  35. }
  36. private static void swap(ref string a, ref string b)
  37. {
  38. string t = a;
  39. a = b;
  40. b = t;
  41. }
  42. }
  43. }

</>复制代码

  1. $
  2. a = 2 b = 1
  3. a = 2 b = 1
  4. x = y-ray y = x-ray
  5. x = y-ray y = x-ray

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77622.html

相关文章

  • 现代编程语言的值传递引用传递

    摘要:在很多特性是和很类似,但是在类型系统中,同时支持值类型与引用类型。 现代编程语言对于值传递与引用传递的支持程度是比较不同的 首先介绍值传递与引用传递的概念 值传递 将变量a传递到其他的函数并对其更改,不能影响a的值 引用传递 在其他的作用域对传入的变量a的更改可以影响a的值 Note: ​ 在这里的值的概念,对于原始类型,指的就是字面的值,如1,2,a; ​ 而对于动态内存...

    Anleb 评论0 收藏0
  • 简述Java内存模型

    摘要:内存模型即,简称,其规范了虚拟机与计算机内存时如何协同工作的,规定了一个线程如何和何时看到其他线程修改过的值,以及在必须时,如何同步访问共享变量。内存模型要求调用栈和本地变量存放在线程栈上,对象存放在堆上。 Java内存模型即Java Memory Model,简称JMM,其规范了Java虚拟机与计算机内存时如何协同工作的,规定了一个线程如何和何时看到其他线程修改过的值,以及在必须时,...

    ACb0y 评论0 收藏0
  • 《深入理解 Java 内存模型》读书笔记

    摘要:前提深入理解内存模型程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结。同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。线程之间的通信由内存模型控制。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6RtPu3BNx3zps1JhSmPICRw7QgeOmxOfTb...

    姘存按 评论0 收藏0
  • 《深入理解 Java 内存模型》读书笔记

    摘要:前提深入理解内存模型程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结。同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。线程之间的通信由内存模型控制。 showImg(https://segmentfault.com/img/remote/1460000013474312?w=1920&h=1271); 前提 《深...

    xuexiangjys 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<