zoukankan      html  css  js  c++  java
  • 【转】函数中的形参问题(指针形参、引用形参、二重指针作为形参)

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

      

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

    来源

  • 相关阅读:
    C++ 动态多维数组的申请与释放
    OpenCV视频的读写
    Python 函数的参数传递
    Python 赋值、浅拷贝和深拷贝
    操作系统学习笔记(七) 死锁
    操作系统学习笔记(六) 文件系统
    浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
    heap与stack的区别
    深入学习golang中new与make区别
    Linux CentOS 7 安装confluence 5.8.10
  • 原文地址:https://www.cnblogs.com/skullboyer/p/9050636.html
Copyright © 2011-2022 走看看