1. 程式人生 > >c++---引用和指標

c++---引用和指標

引用
引用不是定義一個變數,而是給一個已經定義好的變數重新起一個名字
型別&引用變數名=已定義過的變數名
特點
1 一個變數可以取多個別名
2 引用必須初始化
3 引用只能在初始化的時候引用一次,不能改變為引用其他的變數

void Test1()
{
    int a = 1;
    int& b = a;
    cout<<"a:"<<&a<<endl;
    cout<<"b:"<<&b<<endl;
    a=2;
    b=3;
    cout<<"a "
<<a<<endl;// 3 int& c = b; c=4; cout<<"c "<<c<<endl;// 4 引用一個引用變數,別名的別名 }

const 引用
const的不能給非const,就是說許可權只能被縮小不能被放大,可讀可寫的只能給可讀的
不同型別之間不能直接引用,必須加上const,而且還有可能讀的時候丟精度
臨時變數

void Test2()
{
    int a=1;
    const int& b=a;
    a =2;//a變b也會跟著變
    //b=3;//b是const常亮,這就不可以賦值
const int c=1; const int& d=c; // const int& e=c;//const相當於常量,常量具有常性,只有常引用可以引用常量 double f=1.2; //int& g=f;//f是double,g是int,如果引用的話,引用改變,原值豈不是很尷尬 const int& h=f; }

引用做引數
1.【值傳遞】形參生成區域性變數接受實參的值

void Swap(int a,int b)
{
    int tmp=a;
    a=b;
    b=tmp;
}

2.【指標傳遞】

void Swap(int* a,int* b)
{
    int tmp=*a;
    *a=*b;
    *b=tmp;
}

3.【引用傳遞】形參為引用型別,形參是實參的別名

void Swap(int& a,int& b)
{
    int tmp=a;
    a=b;
    b=tmp;
}
void Test3()
{
    int i =1;
    int j=2;
    cout<<"a "<<a<<endl;
    cout<<"b "<<b<<endl;
    Swap(a,b);
    cout<<"a "<<a<<endl;
    cout<<"b "<<b<<endl;
}

如果不希望在函式體內改變引數的值,可以使用常引用傳參(const)
void func(const int& a);

傳值做返回值,傳引用作為返回值

int& Add(int a,int b)
{
    int sum=a+b;
    return sum;
}
int& ret =Add(1,2);

不要返回一個臨時變數的引用,除了函式啥都不是啊
如果返回物件出了當前函式作用域依舊存在,那最好使用引用返回,更高效

引用其實是用指標實現的,存地址這樣的方式實現的
引用和指標
1. 引用只能在定義時初始化一次,之後不能改變指向其他變數;指標變數的值可變
2. 引用必須指向有效的值;指標可以指空
3. sizeof指標和引用的意義不一樣,sizeof引用得到所指向變數的大小;sizeof指標得到物件地址的大小
4. 指標 引用自增自減意義不一樣
5. 引用比指標更安全,指標比引用靈活,也危險,指標所指地方釋放之後最後置NULL,否則會成為野指標

如果有什麼不對的地方,可以評論告訴我,望指導!