(1)用指針傳遞參數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的地址,因此使用*a實際上是取存儲實參的內存單元里的數據,即是對實參進行改變,因此可以達到目的。在使用的過程中需要通過對地址的解引用來操作其所指向的變量,同時可以通過指針的自增自減移動從而改變所指向的值,靈活度較大。
(2)引用作為函數參數進行傳遞時,實質上傳遞的是實參本身,即傳遞進來的不是實參的一個拷貝,因此對形參的修改其實是對實參的修改.因而函數返回后作出的修改會依舊存在,引用傳遞可以節省復制所需要的時間和空間。
(3)對於二重指針的使用情況:對於鏈表和樹或char*字符串時,這些本身就是指針類型,當需要通過形參帶回變化后的結果時,又要使用指針作參數,所以使用二重指針作為形參。如果函數傳參采用一級指針時,解引用時只能改變該指針指向的頭或根結點,而不能影響整個鏈表或樹這個結構。
定義鏈表結構時,LinkList(也就是LNode *)H代表的是整個鏈表,函數傳址調用時,實參傳遞的是地址值。當采用二級指針形參LinkList *L(也就是LNode **)時,要傳遞鏈表的起始地址&H給形參L,而采用一級指針形參LNode *L時,傳遞的是頭結點的地址&(*H)(也就是頭指針H)。
針對以上情況也可以使用指針的引用來代替二重指針,以下是分別用二重指針和指針引用作為形參的示例程序:
#include<iostream>
using namespace std;
void test(int **p) //以指針類型變量的地址作為形參
{
int a=1;
*p=&a; //*p作為一個指針變量存放的是變量a的地址
cout<<*p<<" "<<**p<<endl;
}
int main(void)
{
int *p=NULL; //定義指針類型的變量p
test(&p); //通過指針地址作為形參傳遞改變了指針p的內容
if(p==NULL)
cout<<"指針p為NULL"<<endl;
system("pause");
return 0;
}
下面是利用形參為指針的引用的函數:
#include<iostream>
using namespace std;
void test(int *&p)
{
int a=1;
p=&a;
cout<<p<<" "<<*p<<endl;
}
int main(void)
{
int *p=NULL;
test(p);
if(p==NULL)
cout<<"指針p為NULL"<<endl;
else
cout<<p<<" "<<*p<<endl;
system("pause");
return 0;
}
可以看出利用指針的引用相較二重指針達到了相同的功能,但比使用二重指針要簡單明了(與一重指針相似)
【來源】
