C 引用和指針

原文鏈接

引用是什麼

引用不是重新定義一個變量,而是給一個已經存在的變量取的別名。 
語法:類型& 引用變量名=已定義的變量名 

引用的特點: 
1、一個變量可以有多個別名。 
2、引用必須初始化。 
3、引用只能在初始化的時候使用一次,不能在作爲其它變量的別名。 

引用注意事項:

1.引用必須被初始化; 
2.引用一旦與初始值對象綁定,就不會變化(引用從一而終)!!! 
3.引用初始值必須爲一個對象,不能使常數 
4.引用必須與被引用的對象類型一致

重點:作用在引用上的所有操作事實上都是作用在該引用所綁定的對象上。

使用引用有何優點?

  在傳參的時候,使用指針傳參,編譯器需要給指針另行分配存儲單元,存儲一個該指針的副本,在函數中對這個副本進行操作;而使用引用傳參,編譯器就不需要分配存儲空間和保存副本了,函數將直接對實參進行操作。所以使用引用使得程序的運行速度更快,執行效率更高。

這裏寫圖片描述 
我們可以看出別名和本來的變量指向同一塊空間,是否引用變量的改變會引起原有變量的改變?這裏寫圖片描述

const引用

#include<iostream>
using namespace std;
void test(){
    int a = 4;
    const int& b = a;
    a = 10;       //a改變b也會隨之改變
    //b = 12;    //常量不可以賦值

    const int c = 3;
    const int& d = c;
    //int& e = d;   //類型不匹配
    const int& e = d;//常量具有常性,只有const修飾的引用才能引用常量


    double f = 1.1;
    //int& g = f;
    const int& g = f;
    //double 無法轉爲int& ,
    //f在賦值時候會生成一個臨時變量,臨時變量具有常性,所以不能賦值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

引用做參數

以Swap函數爲例,比較值傳遞、址傳遞,引用傳遞。


#include<iostream>
using namespace std;

//值傳遞,無法實現交換兩值的效果
void Swap1(int a, int b){
    int tmp = a;
    a = b;
    b = tmp;

}

//址傳遞
void Swap2(int* a, int* b){
    int tmp = *a;
    *a = *b;
    *b = tmp;

}

//傳引用
void Swap3(int& a, int& b){
    int tmp = a;
    a = b;
    b = tmp;

}

int main(){
    int a = 10;
    int b = 20;
    int& c = a;
    int& d = b;
    Swap1(a, b);// 10 20
    cout << a;
    cout << b << endl;
    Swap3(c, d);//20 10
    cout << a;
    cout << b << endl;
    Swap2(&a, &b);//10 20此處是將上次交換後的20 10再次交換
    cout << a;
    cout << b << endl;

    system("pause");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

所以說在傳參這一塊引用和指針一樣可以避免傳值,形參是實參的臨時拷貝,所以形參改變不會影響到實參。 
….總結:傳參傳結構體時要避免直接傳結構體,因爲一旦結構體存在數組時,會先開好等大的空間然後一步步將數據拷進去,這樣就會很低效。

引用做返回值

#include<iostream>
using namespace std;


//傳值做返回值
int Add(int a, int b){
    int ret = a + b;
    return ret;
}


int& Add1(int a, int b){
    int ret = a + b;
    return ret;
}

void test(){
    int a = 6;
    int b = 4;
    int c = Add(a, b);
    int d = Add1(a, b);

}
int main()
{
    test();
    system("pause");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

這裏寫圖片描述
…….結論: 
1、不要返回一個臨時變量的引用。 
2、如果返回對象出了作用域仍然存在,儘量使用引用作爲返回值,會更加高效。

指針和引用的區別與聯繫:

1、引用只能在定義時初始化一次,之後不可以改變指向其他變量;指針變量的值可變。 
2、引用必須指向有效的變量,指針可以爲NULL。 
3、sizeof(引用)得到所指向變量的大小,sizeof(指針)得到指向變量的地址的大小 
4、指針++,加的是所指向類型的大小,引用++加的是1,加在變量上。 
5、指針會有野指針的風險,所以引用相較於指針更加安全。

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