引用與指針

一、引用的概念及用法
引用:引用不是定義一個新的變量,不開闢內存空間,而是一個變量的別。與原變量的數值,地址相同。對其中任意數值進行操作都會互相影像(值同步)。
用法:類型& 變量名。
          變量—-const 引用—–引用不可修改變量,變量修改後,引用變量值改變
const 變量—-引用————錯誤,編譯不通過,變量不可修改,引用也不可修改,不可直接引用
const 變量—-const 引用—-變量與引用都不可修改。
總結:const修飾的變量,變量的權限不可放大,修飾的內容不可修改

二、特點:
1、引用必須初始化,
2、引用只能在初始化時引用一次,之後不能再改變爲其它的引用(作爲某一變量的別名後,不可再更改成其它變量的別名(永久性))。
3、一個變量可對應多個引用,一個引用只能對應於某一變量。

三、引用做參數
     引用是一個變量的別名,做參數時不對原變量進行拷貝,效率高。所以建議使用引用傳參。當不修改變量時建議加上const修飾,防止錯誤的修改。
   傳參時,形參只是實參的一份拷貝,使用引用傳參時,不需創建副本.對於對象就不會調用構造函數和析構函數,效率高
四、引用做返回值
   引用作返回值時,不要返回一個局部變量的引用。因爲返回的僅僅是一個局部變量的地址,函數退出時,局部變量被銷燬,接收的內容不一定準確,且存在越界訪問問題和內存泄露的危險
      當返回的對象出了此函數作用域依然存在,則最好返回引用,這樣效率更高。

五、引用和指針的區別
1、引用是一個變量的別名,不佔內存空間,與原變量共用一塊內存
     指針存儲的是某一變量的地址,佔4個字節的空間(32位,8個字節是64位)
2、引用必須在定義時進行初始化,且初始化後不可再作爲其它變量的引用。
     指針可不用進行初始化,且初始化後可修改,可指向其它變量。
3、引用必須指向有效的變量
     指針可以爲空
4、sizeof引用是變量類型的大小
     sizeof指針是一個地址所佔空間的大小
5、對引用++,是對變量的值+1
      指針++,是地址跳過一個所指類型的大小
6、引用在傳參時(實參),傳的是變量名
      指針在傳參時,傳的是變量的地址

6、在底層實現上引用與指針類似,都是通過指針實現的,通過創建一個變量存其地址。
指針比引用更靈活,但也更危險,使用指針是要注意檢查指針爲空的問題,釋放空間後最好將其置空,否則可能存在野指針問題。

六、代碼案例:

#include<iostream>
#include<stdlib.h>
using namespace std;

int& fun(int& num)
{
    int n = num;
    return n;//返回一個局部變量的引用
}

int main()
{
    int num = 1;
    int& bnum = num;//nun的別名
    const int& cnum = num;//const修飾num的別名,
    //cnum = 2;//cnum值不可改變 
    num = 5;//bnum,cnum隨num值改變
    cout << num << endl;
    cout << bnum << endl;
    cout << cnum << endl;

    const int num1 = 1;
    const int& cnum1 = num1;
    //int& bnum1 = num1;//錯誤const修飾的變量,不可使用非const引用
    cout << num1 << endl;
    cout << cnum1 << endl;

    int n = fun(num);
    cout << num << endl;//5
    cout << n << endl;//5

    int& m = fun(num);//接收的是一個局部變量的引用
    cout << num << endl;//5
    cout << m << endl;//隨機值

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