摘要:在很多特性是和很類似,但是在類型系統中,同時支持值類型與引用類型。
現代編程語言對于值傳遞與引用傳遞的支持程度是比較不同的
首先介紹值傳遞與引用傳遞的概念
值傳遞將變量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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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); 前提 《深...
閱讀 1652·2021-08-13 15:03
閱讀 2082·2019-08-30 15:54
閱讀 3544·2019-08-26 10:30
閱讀 1020·2019-08-26 10:22
閱讀 2746·2019-08-23 14:42
閱讀 1809·2019-08-22 11:16
閱讀 1038·2019-08-21 18:33
閱讀 3159·2019-08-21 17:28