引用型指針void fun( type *&e)詳解

引用和指針使用原則:
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; //不正確,有空指針,無空引用
(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;
}
先寫到這,以後留着再看。

 

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