成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

現(xiàn)代編程語(yǔ)言的值傳遞與引用傳遞

Anleb / 2386人閱讀

摘要:在很多特性是和很類似,但是在類型系統(tǒng)中,同時(shí)支持值類型與引用類型。

現(xiàn)代編程語(yǔ)言對(duì)于值傳遞與引用傳遞的支持程度是比較不同的

首先介紹值傳遞與引用傳遞的概念

值傳遞

將變量a傳遞到其他的函數(shù)并對(duì)其更改,不能影響a的值

引用傳遞

在其他的作用域?qū)魅氲淖兞?strong>a的更改可以影響a的值

Note:

? 在這里的值的概念,對(duì)于原始類型,指的就是字面的值,如1,2,"a";

? 而對(duì)于動(dòng)態(tài)內(nèi)存分配/類,則指的是指向這個(gè)分配內(nèi)存/類的引用,而非解引用后指向的內(nèi)存/類所保存的值

C語(yǔ)言

C語(yǔ)言本身只支持值傳遞,但是通過指針這一概念,通過解引用可以達(dá)到引用傳遞的效果

C++

作為C語(yǔ)言的超集發(fā)展起來(lái)的語(yǔ)言,C++支持C語(yǔ)言的值傳遞與指針傳遞,同時(shí)C++還添加了引用傳遞(某種意義上是指針的語(yǔ)法糖),所以C++實(shí)際上通過兩種語(yǔ)法支持引用傳遞

下面演示C/C++的值傳遞與引用傳遞

#include 
#include 
#include 

using namespace std;

/// 基礎(chǔ)類型熱引用
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;
}

/// 基于指針進(jìn)行引用傳遞
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);//值傳遞 無(wú)效果
    cout << x << " " << y << endl;

    /// rief  使用指針本身進(jìn)行值傳遞 通過解引用達(dá)到了解引用的效果
    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:

使用指針可以改變其指向的對(duì)象的值,但是其無(wú)法改變其指針自己的值,如果想改變指針指向的對(duì)象,如果想在其他函數(shù)改變指針的值,只能取這個(gè)指針的指針,這又回到了swap這個(gè)問題

Java

Java可能是處于控制語(yǔ)言的復(fù)雜度的考慮,只支持值傳遞。

同樣的還有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很類似,但是在類型系統(tǒng)中,C#同時(shí)支持值類型與引用類型。

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1, b = 2;
            swap(ref a, ref b);
            Console.WriteLine($"a = {a} b = ");

            swap(a, b);
            Console.WriteLine($"a = {a} 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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43750.html

相關(guān)文章

  • 現(xiàn)代編程語(yǔ)言的值傳遞引用傳遞

    摘要:在很多特性是和很類似,但是在類型系統(tǒng)中,同時(shí)支持值類型與引用類型。 現(xiàn)代編程語(yǔ)言對(duì)于值傳遞與引用傳遞的支持程度是比較不同的 首先介紹值傳遞與引用傳遞的概念 值傳遞 將變量a傳遞到其他的函數(shù)并對(duì)其更改,不能影響a的值 引用傳遞 在其他的作用域?qū)魅氲淖兞縜的更改可以影響a的值 Note: ? 在這里的值的概念,對(duì)于原始類型,指的就是字面的值,如1,2,a; ? 而對(duì)于動(dòng)態(tài)內(nèi)存...

    wenhai.he 評(píng)論0 收藏0
  • 簡(jiǎn)述Java內(nèi)存模型

    摘要:內(nèi)存模型即,簡(jiǎn)稱,其規(guī)范了虛擬機(jī)與計(jì)算機(jī)內(nèi)存時(shí)如何協(xié)同工作的,規(guī)定了一個(gè)線程如何和何時(shí)看到其他線程修改過的值,以及在必須時(shí),如何同步訪問共享變量。內(nèi)存模型要求調(diào)用棧和本地變量存放在線程棧上,對(duì)象存放在堆上。 Java內(nèi)存模型即Java Memory Model,簡(jiǎn)稱JMM,其規(guī)范了Java虛擬機(jī)與計(jì)算機(jī)內(nèi)存時(shí)如何協(xié)同工作的,規(guī)定了一個(gè)線程如何和何時(shí)看到其他線程修改過的值,以及在必須時(shí),...

    ACb0y 評(píng)論0 收藏0
  • 《深入理解 Java 內(nèi)存模型》讀書筆記

    摘要:前提深入理解內(nèi)存模型程曉明著,該書在以前看過一遍,現(xiàn)在學(xué)的東西越多,感覺那塊越重要,于是又再細(xì)看一遍,于是便有了下面的讀書筆記總結(jié)。同步同步是指程序用于控制不同線程之間操作發(fā)生相對(duì)順序的機(jī)制。線程之間的通信由內(nèi)存模型控制。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6RtPu3BNx3zps1JhSmPICRw7QgeOmxOfTb...

    姘存按 評(píng)論0 收藏0
  • 《深入理解 Java 內(nèi)存模型》讀書筆記

    摘要:前提深入理解內(nèi)存模型程曉明著,該書在以前看過一遍,現(xiàn)在學(xué)的東西越多,感覺那塊越重要,于是又再細(xì)看一遍,于是便有了下面的讀書筆記總結(jié)。同步同步是指程序用于控制不同線程之間操作發(fā)生相對(duì)順序的機(jī)制。線程之間的通信由內(nèi)存模型控制。 showImg(https://segmentfault.com/img/remote/1460000013474312?w=1920&h=1271); 前提 《深...

    xuexiangjys 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<