【转】函数中的形参问题(指针形参、引用形参、二重指针作为形参)

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

  

可以看出利用指针的引用相较二重指针达到了相同的功能,但比使用二重指针要简单明了(与一重指针相似)

来源

猜你喜欢

转载自www.cnblogs.com/skullboyer/p/9050636.html