int & *p; //不能建立指向引用的指標;int *a; int * & p=a; //正確,指標變數的引用
引用和指標使用原則: 1.在可以用引用的情況下,不要用指標; 2.引用不允許重新賦值.,當使用一個變數指向不同的對象時,必須用指標; 3.引用不允許為空白,當存在對象為空白時,必須使用指標。
引用說明: (1) double & rr=1; 等價與 double temp; temp=double(1); double & rr=temp; (2) int *a; int * & p=a; int b=8; p=&b; //正確,指標變數的引用 void & a=3; //不正確,沒有變數或對象的類型是void int & ri=NULL; //不正確,有null 指標,無Null 參考 (3) int & ra=int; //不正確,不能用類型來初始化 int *p=new int; int & r=*p; //正確 (4) 引用不同於一般變數,下面型別宣告是非法的: int &b[3]; //不能建立引用數組 int & *p; //不能建立指向引用的指標 int &&r; //不能建立引用的引用 (5) 當使用&運算子取一個引用的地址時,其值為所引用變數的地址,
一段代碼:
#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 的比較中,你能發現它們的不同點嗎?
二、對代碼進行解釋:
#include <iostream>
using namespace std;
void freePtr1(int* p1)
{
//未釋放記憶體前 -> p1 Address : 0012FDDC p1 value : 003429B8,在這裡,p1它也是一個變數,既然是一個變數,那麼它將會以值的傳遞,把外部變數p1傳到棧內,在棧內產生一個地址:0012FDDC,當然,它的值不會變仍然是指向堆地址:003429B8 。
delete p1; //系統回收p1值的地址003429B8處的記憶體。
p1 = NULL;//對p1賦以NULL值即:00000000,注意:p1本身的地址並沒有變,變的是p1的值。
//釋放記憶體後 -> p1 Address : 0012FDDC p1 value : 00000000,出棧後,p1由於是一個臨時對象,出棧後它會自動被視為無效。
}
void freePtr2(int*& p2)
{
//未釋放記憶體前 -> p2 Address : 0012FEC8 p2 value : 003429B8,p2是一個指標的引用,即引用指向指標,記住引用的特點:對引用的對象直接操作。所以它的地址和值與棧外的main()函數中,p2的值是同一個。
delete p2; //對p2所引用的指標進行釋放記憶體,即:系統回收main()函數中 p2的值 003429B8 地址處的記憶體。
p2 = NULL;//對main()函數中p2的指標賦以NULL值。
//釋放記憶體後 -> p2 Address : 0012FEC8 p2 value : 00000000,由於操作的對象都是main()函數中的p2,所以它將應用到原變數中。
}
void main()
{
int *p1 = new int;
//釋放記憶體前-> p1 Address : 0012FED4 p1 value : 003429B8
freePtr1(p1);
//釋放記憶體後-> p1 Address : 0012FED4 p1 value : 003429B8
int *p2 = new int;
//釋放記憶體前-> p2 Address : 0012FEC8 p2 value : 003429B8
freePtr2(p2);
//釋放記憶體後-> p2 Address : 0012FEC8 p2 value : 00000000
system("pause");
} ----------------------------------------------- 指標引用的經典用法:
#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;
}
原文:http://www.cppblog.com/mzty/archive/2005/12/08/1621.html