引用&指針、傳值&傳引用&傳址的區別

引用


概念(貼標籤式)


引用不是新定義一個變量,而是給已存在變量取了一個別名,編譯器不會爲引用變量開闢內存空間,它和它引用的變量共用同一塊內存空間
類型& 引用變量名(對象名) = 引用實體;


這裏寫圖片描述


使用場景


1.作爲函數形參
2.作爲函數返回值


注意事項


a. 引用在定義時必須初始化
b. 一個變量可以有多個引用
c. 引用一旦引用一個實體,再不能引用其他實體
d.不能返回棧空間上的引用


//下列代碼運行結果是?
int& Add(int a, int b){
    int c = a + b;
    return c;
}

int main(){
    int a = 10;
    int b = 20;
    int& sum = Add(a,b);
    cout << sum << endl;
    cout << sum << endl;
    return 0;
}

//數組的引用
int a[10] = {0};
int (&ra)[10] = a;

引用與指針


相同點:
底層的實現方式相同,都是按照指針的方式來實現的


不同點:
1.引用在定義時必須初始化,指針沒有要求
2.一旦一個引用被初始化爲指向一個對象,就不能再指向其他對象,而指針可以在任何時候指向任何一個同類型對象
3.沒有NULL引用,但有NULL指針
4.在sizeof中含義不同:引用結果爲引用類型的大小,但指針始終是地址*空間所佔字節個數
5.引用自加改變變量的內容,指針自加改變了指針指向
6.有多級指針,但是沒有多級引用
7.指針需要手動尋址,引用通過編譯器實現尋址
8.引用比指針使用起來相對更安全


傳值與傳址區別:


傳值


傳值方式,在函數調用過程中會生成一份臨時變量用形參代替,最終把實參的值傳遞給新分配的臨時變量即形參


優點:實參不會被污染改變


缺點:改變不了外部實參,當實參數量過大時,效率低,生成大量臨時變量


傳址:


優點:對參數的改變可以體現在外部實參上,當實參數據量過大時,傳址效率高


缺點:不安全,容易被改變


傳引用


這裏寫圖片描述


傳址、傳值、傳引用的效率


傳引用 與傳址差不多,速率遠大於傳值


//通過下列代碼 改變傳參方式 可觀測三種傳參方式的效率
typedef struct Arr{
    int arr[10000];
}A;

void fun(A a)
{
}

void Test(){
    A a;
    for (int i = 0; i < 10000000; ++i){
        fun(a);
    }
}

int main(){
    size_t BeginTime = GetTickCount();
    Test();
    size_t EndTime = GetTickCount();

    cout << EndTime - BeginTime << endl;

    return 0;
}

下列代碼運行之後結果?


void Swap(int& a, int& b){
    int tmp = a;
    a = b; //崩
    b = tmp;
}
int main(){
    int a = 10;
    int *p = NULL;

    Swap(a, *p);

    return 0;
}

可以編譯鏈接,運行後,程序崩潰,b所引用的空間爲空


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章