摘要:在很多特性是和很类似,但是在类型系统中,同时支持值类型与引用类型。
现代编程语言对于值传递与引用传递的支持程度是比较不同的
首先介绍值传递与引用传递的概念
值传递将变量a传递到其他的函数并对其更改,不能影响a的值
引用传递在其他的作用域对传入的变量a的更改可以影响a的值
Note:
在这里的值的概念,对于原始类型,指的就是字面的值,如1,2,"a";
而对于动态内存分配/类,则指的是指向这个分配内存/类的引用,而非解引用后指向的内存/类所保存的值
C语言C语言本身只支持值传递,但是通过指针这一概念,通过解引用可以达到引用传递的效果
C++作为C语言的超集发展起来的语言,C++支持C语言的值传递与指针传递,同时C++还添加了引用传递(某种意义上是指针的语法糖),所以C++实际上通过两种语法支持引用传递
下面演示C/C++的值传递与引用传递
#include#include #include using namespace std; /// 基础类型热引用 void swap_ref(int &a, int &b) { int t = a; a = b; b = t; } /// 类的引用 void swap_ref(string &a, string &b) { string t = a; a = b; b = t; } /// 值传递 void swap_val(int a, int b) { int t = a; a = b; b = t; } /// 类的值传递 void swap_val(string a, string b) { string t = a; a = b; b = t; } /// 基于指针进行引用传递 void swap_ptr(int *a, int *b) { int t = *a; *a = *b; *b = t; } void swap_ptr(string *a, string *b) { string t = *a; *a = *b; *b = t; } int main() { int a = 1; int b = 2; swap_ref(a, b);//引用传递 printf("%d %d ", a, b); swap_val(a, b);//值传递 printf("%d %d ", a, b); string x = "x", y = "y"; swap_ref(x, y);//引用传递 cout << x << " " << y << endl; swap_val(x, y);//值传递 无效果 cout << x << " " << y << endl; /// rief 使用指针本身进行值传递 通过解引用达到了解引用的效果 swap_ptr(&a, &b);//通过指针引用传递 printf("%d %d ", a, b); swap_ptr(&x, &y);//指针的引用传递 cout << x << " " << y << endl; return 0; }
$ ./main.exe 2 1 2 1 y x y x 1 2 x y
Notes:
使用指针可以改变其指向的对象的值,但是其无法改变其指针自己的值,如果想改变指针指向的对象,如果想在其他函数改变指针的值,只能取这个指针的指针,这又回到了swap这个问题
JavaJava可能是处于控制语言的复杂度的考虑,只支持值传递。
同样的还有Python。
public class type { public static void main(String[] args) { String s = "One String"; System.out.println(s); changeString(s); System.out.println(s); } public static void changeString(String s) { s = "Yet Another String"; } }C
C#在很多特性是和Java很类似,但是在类型系统中,C#同时支持值类型与引用类型。
namespace ConsoleApp1 { class Program { static void Main(string[] args) { int a = 1, b = 2; swap(ref a, ref b); Console.WriteLine($"a = {a} b = {b}"); swap(a, b); Console.WriteLine($"a = {a} b = {b}"); string x = "x-ray", y = "y-ray"; swap(ref x, ref y); Console.WriteLine($"x = {x} y = {y}"); swap(x, y); Console.WriteLine($"x = {x} y = {y}"); } private static void swap(int a, int b) { int t = a; a = b; b = t; } private static void swap(ref int a, ref int b) { int t = a; a = b; b = t; } private static void swap(string a, string b) { string t = a; a = b; b = t; } private static void swap(ref string a, ref string b) { string t = a; a = b; b = t; } } }
$ a = 2 b = 1 a = 2 b = 1 x = y-ray y = x-ray x = y-ray y = x-ray
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77622.html
摘要:在很多特性是和很类似,但是在类型系统中,同时支持值类型与引用类型。 现代编程语言对于值传递与引用传递的支持程度是比较不同的 首先介绍值传递与引用传递的概念 值传递 将变量a传递到其他的函数并对其更改,不能影响a的值 引用传递 在其他的作用域对传入的变量a的更改可以影响a的值 Note: 在这里的值的概念,对于原始类型,指的就是字面的值,如1,2,a; 而对于动态内存...
摘要:内存模型即,简称,其规范了虚拟机与计算机内存时如何协同工作的,规定了一个线程如何和何时看到其他线程修改过的值,以及在必须时,如何同步访问共享变量。内存模型要求调用栈和本地变量存放在线程栈上,对象存放在堆上。 Java内存模型即Java Memory Model,简称JMM,其规范了Java虚拟机与计算机内存时如何协同工作的,规定了一个线程如何和何时看到其他线程修改过的值,以及在必须时,...
摘要:前提深入理解内存模型程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结。同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。线程之间的通信由内存模型控制。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6RtPu3BNx3zps1JhSmPICRw7QgeOmxOfTb...
摘要:前提深入理解内存模型程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结。同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。线程之间的通信由内存模型控制。 showImg(https://segmentfault.com/img/remote/1460000013474312?w=1920&h=1271); 前提 《深...
阅读 1651·2021-08-13 15:03
阅读 2082·2019-08-30 15:54
阅读 3543·2019-08-26 10:30
阅读 1019·2019-08-26 10:22
阅读 2745·2019-08-23 14:42
阅读 1808·2019-08-22 11:16
阅读 1037·2019-08-21 18:33
阅读 3159·2019-08-21 17:28