【轉】函數中的形參問題(指針形參、引用形參、二重指針作為形參)


(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;
}

  

可以看出利用指針的引用相較二重指針達到了相同的功能,但比使用二重指針要簡單明了(與一重指針相似)

 

 

來源

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM