引用和指針使用原則:
1.在可以用引用的情況下,不要用指針;
2.引用不允許重新賦值.,當(dāng)使用一個(gè)變量指向不同的對(duì)象時(shí),必須用指針;
3.引用不允許為空,當(dāng)存在對(duì)象為空時(shí),必須使用指針。
引用說(shuō)明:
(1) double & rr=1; 等價(jià)與 double temp; temp=double(1); double & rr=temp;
(2) int *a; int * & p=a; int b=8; p=&b; //正確,指針變量的引用
void & a=3; //不正確,沒有變量或?qū)ο蟮念愋褪莢oid
int & ri=NULL; //不正確,有空指針,無(wú)空引用
(3) int & ra=int; //不正確,不能用類型來(lái)初始化
int *p=new int; int & r=*p; //正確
(4) 引用不同于一般變量,下面類型聲明是非法的:
int &b[3]; //不能建立引用數(shù)組
int & *p; //不能建立指向引用的指針
int &&r; //不能建立引用的引用
(5) 當(dāng)使用&運(yùn)算符取一個(gè)引用的地址時(shí),其值為所引用變量的地址,
一段代碼:
#include <iostream>
using namespace std;
void freePtr1(int* p1)
{
delete p1;
p1 = NULL;
}
void freePtr2(int*& p2)
{
delete p2;
p2 = NULL;
}
void main()
{
int *p1 = new int;
*p1 = 1;
freePtr1(p1);
int *p2 = new int;
*p2 = 2;
freePtr2(p2);
system("pause");
}
思考:在freePtr1和freePtr2 的比較中,你能發(fā)現(xiàn)它們的不同點(diǎn)嗎?
二、對(duì)代碼進(jìn)行解釋:
#include <iostream>
using namespace std;
void freePtr1(int* p1)
{
//未釋放內(nèi)存前 -> p1 Address : 0012FDDC p1 value : 003429B8,在這里,p1它也是一個(gè)變量,既然是一個(gè)變量,那么它將會(huì)以值的傳遞,把外部變量p1傳到棧內(nèi),在棧內(nèi)產(chǎn)生一個(gè)地址:0012FDDC,當(dāng)然,它的值不會(huì)變?nèi)匀皇侵赶蚨训刂罚?03429B8 。
delete p1; //系統(tǒng)回收p1值的地址003429B8處的內(nèi)存。
p1 = NULL;//對(duì)p1賦以NULL值即:00000000,注意:p1本身的地址并沒有變,變的是p1的值。
//釋放內(nèi)存后 -> p1 Address : 0012FDDC p1 value : 00000000,出棧后,p1由于是一個(gè)臨時(shí)對(duì)象,出棧后它會(huì)自動(dòng)被視為無(wú)效。
}
void freePtr2(int*& p2)
{
//未釋放內(nèi)存前 -> p2 Address : 0012FEC8 p2 value : 003429B8,p2是一個(gè)指針的引用,即引用指向指針,記住引用的特點(diǎn):對(duì)引用的對(duì)象直接操作。所以它的地址和值與棧外的main()函數(shù)中,p2的值是同一個(gè)。
delete p2; //對(duì)p2所引用的指針進(jìn)行釋放內(nèi)存,即:系統(tǒng)回收main()函數(shù)中 p2的值 003429B8 地址處的內(nèi)存。
p2 = NULL;//對(duì)main()函數(shù)中p2的指針賦以NULL值。
//釋放內(nèi)存后 -> p2 Address : 0012FEC8 p2 value : 00000000,由于操作的對(duì)象都是main()函數(shù)中的p2,所以它將應(yīng)用到原變量中。
}
void main()
{
int *p1 = new int;
//釋放內(nèi)存前-> p1 Address : 0012FED4 p1 value : 003429B8
freePtr1(p1);
//釋放內(nèi)存后-> p1 Address : 0012FED4 p1 value : 003429B8
int *p2 = new int;
//釋放內(nèi)存前-> p2 Address : 0012FEC8 p2 value : 003429B8
freePtr2(p2);
//釋放內(nèi)存后-> p2 Address : 0012FEC8 p2 value : 00000000
system("pause");
}
-----------------------------------------------
指針引用的經(jīng)典用法:
#include <iostream>
using namespace std;
void all1(int **p)
{
int *pp = new int;
*p = pp;
}
void all2(int*& p)
{
int *pp = new int;
p = pp;
}
void main()
{
int *a1;
all1(&a1);
*a1 = 1;
cout<<*a1<<endl;
int *a2;
all2(a2);
*a2 = 2;
cout<<*a2<<endl;
}
---------------------------------------------------------