現代編程語言的值傳遞與引用傳遞

現代編程語言對於值傳遞與引用傳遞的支持程度是比較不一樣的java

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

值傳遞

將變量a傳遞到其餘的函數並對其更改,不能影響a的值編程

引用傳遞

在其餘的做用域對傳入的變量a的更改能夠影響a的值c#

Note:bash

​ 在這裏的值的概念,對於原始類型,指的就是字面的值,如1,2,'a';編程語言

​ 而對於動態內存分配/類,則指的是指向這個分配內存/類的引用,而非解引用後指向的內存/類所保存的值函數

C語言

C語言自己只支持值傳遞,可是經過指針這一律念,經過解引用能夠達到引用傳遞的效果spa

C++

做爲C語言的超集發展起來的語言,C++支持C語言的值傳遞與指針傳遞,同時C++還添加了引用傳遞(某種意義上是指針的語法糖),因此C++實際上經過兩種語法支持引用傳遞指針

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

#include <iostream>
#include <vector>
#include <algorithm>

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\n", a, b);

    swap_val(a, b);//值傳遞
    printf("%d %d\n", a, b);

    string x = "x", y = "y";

    swap_ref(x, y);//引用傳遞
    cout << x << " " << y << endl;

    swap_val(x, y);//值傳遞 無效果
    cout << x << " " << y << endl;

    /// \brief  使用指針自己進行值傳遞 經過解引用達到了解引用的效果
    swap_ptr(&a, &b);//經過指針引用傳遞
    printf("%d %d\n", 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這個問題

Java

Java多是處於控制語言的複雜度的考慮,只支持值傳遞。

一樣的還有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
相關文章
相關標籤/搜索