1. 程式人生 > >函式中的形參問題(指標形參、引用形參、二重指標作為形參)

函式中的形參問題(指標形參、引用形參、二重指標作為形參)

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

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