1.指針和引用的定義和性質(zhì)區(qū)別:
(1)指針:指針是一個變量辉巡,只不過這個變量存儲的是一個地址恨憎,指向內(nèi)存的一個存儲單元;
???? 而引用跟原來的變量實質(zhì)上是同一個東西郊楣,只不過是原變量的一個別名而已
(2)可以有const指針憔恳,但是沒有const引用;
const引用可以用不同類型的對象初始化(只要能從一種類型轉換到另一種類型即可)净蚤,也可以是不可尋址的值钥组,如文字常量
double?dval?=?3.14159;
//下3行僅對const引用是合法的
const?int?&ir?=?1024;
const?int?&ir2?=dval;
const?double?&dr?=?dval?+?1.0;
引用在內(nèi)部存放的是一個對象的地址,它是該對象的別名今瀑。對于不可尋址的值程梦,如文字常量,以及不同類型的對象橘荠,編譯器為了實現(xiàn)引用屿附,必須生成一個臨時對象,引用實際上指向該對象哥童,但用戶不能訪問它挺份。
例如:
double?dval?=?23;
const?int?&ri?=dval;
編譯器將其轉換為:
int?tmp?=?dval;?//?double?->?int
const?int?&ri?=?tmp;
(3)指針可以有多級,但是引用只能是一級(int **p如蚜;合法 而 int &&a是不合法的)
(4)指針的值可以為空压恒,但是引用的值不能為NULL,并且引用在定義的時候必須初始化错邦;
(5)指針的值在初始化后可以改變,即指向其它的存儲單元型宙,而引用在進行初始化后就不會再改變了撬呢。
(6)"sizeof引用"得到的是所指向的變量(對象)的大小,而"sizeof指針"得到的是指針本身的大凶倍摇魂拦;
(7)指針和引用的自增(++)運算意義不一樣毛仪;
2.指針和引用作為函數(shù)參數(shù)進行傳遞時的區(qū)別:
(1)指針作為參數(shù)進行傳遞:
用指針傳遞參數(shù),可以實現(xiàn)對實參進行改變的目的芯勘,是因為傳遞過來的是實參的地址箱靴,因此使用*a實際上是取存儲實參的內(nèi)存單元里的數(shù)據(jù),即是對實參進行改變荷愕,因此可以達到目的
#include<iostream>
using namespace std;
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main(void)
{
int a=1,b=2;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
return 0;
}
2.將引用作為函數(shù)的參數(shù)進行傳遞
引用作為函數(shù)參數(shù)進行傳遞時衡怀,實質(zhì)上傳遞的是實參本身,即傳遞進來的不是實參的一個拷貝安疗,因此對形參的修改其實是對實參的修改抛杨,所以在用引用進行參數(shù)傳遞時,不僅節(jié)約時間荐类,而且可以節(jié)約空間怖现。
#include<iostream>
using namespace std;
void test(int &a)
{
cout<<&a<<" "<<a<<endl;
}
int main(void)
{
? ? int a=1;
? ? cout<<&a<<" "<<a<<endl;
? ? test(a);
? ? return 0;
}
參考:https://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html