zoukankan      html  css  js  c++  java
  • C++ 指针形参和指针引用形参的原理分析

    C++ 函数的参数传递可以分为:值传递和引用传递。

    两者的最大区别也很简单,如果该函数的参数只是读的话,值传递就可以满足。如果该函数的参数需要进行修改并返回的时候,就应该进行引用传递。

    C++指针作为参数也遵循以上原则,先来看几个例子:

    void test1(int *p) {
        *p = 5;
    }
    
    int main() {
    
        int a = 1;
    
        int *p = &a;
    
        std::cout << *p << std::endl;
    
        test1(p);
    
        std::cout << *p << std::endl;
    
        return 1;
    }
    //结果为:1 5
    
    void test2(int *p) {
        int b = 5;
        p = &b;
    }
    
    int main() {
    
        int a = 1;
    
        int *p = &a;
    
        std::cout << *p << std::endl;
    
        test2(p);
    
        std::cout << *p << std::endl;
    
        return 1;
    }
    
    //结果为: 1 1
    
    
    
    void test3(int *&p) {
        int b = 5;
        p = &b;
    }
    
    int main() {
    
        int a = 1;
    
        int *p = &a;
    
        std::cout << *p << std::endl;
    
        test3(p);
    
        std::cout << *p << std::endl;
    
        return 1;
    }
    
    //结果为:1 5

    通过以上三种测试,我们可以发现指针作为参数形参传递的一个基本原理:

    指针作为函数的参数,可以修改指针地址指向的值,并且能够正确返回,但是无法通过直接修改指针的地址来改变指针的返回,因为指针参数当中,指针的地址是值传递,无返通过修改值传递得到正确返回。如果想通过修改指针的地址来修改指针的返回结果,需要通过引用传递,则必须将指针改为指针的引用作为函数参数,如void test3(*& p)函数一样。

    另外还有一种方法需要思考一下,既然的指针作为参数,其地址是值传递,不能进行修改地址而得到有效返回,但是我们可以修改指针地址指向的值,进行有效返回。既然如果,我们可以在指针参数的基础上再加一个指针,这样原指针就是指针地址指向的值了,可以进行修改返回,具体代码可以如下所示:

    void test4(int **p) {
        int b = 5;
        *p =&b;
    }
    
    int main() {
    
        int a = 1;
    
        int *p=&a;
    
        std::cout << *p << std::endl;
    
        test(&p);
    
        std::cout << *p << std::endl;
    
        return 1;
    }
    //结果为:1 5
  • 相关阅读:
    Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动
    在Ubuntu上如何往fcitx里添加输入法
    LaTeX 笔记---Q&A
    Hong Kong Regional Online Preliminary 2016 C. Classrooms
    Codeforces 711E ZS and The Birthday Paradox
    poj 2342 anniversary party
    poj 1088 滑雪
    poj 2479 maximum sum
    poj 2481 cows
    poj 2352 stars
  • 原文地址:https://www.cnblogs.com/code-wangjun/p/9339851.html
Copyright © 2011-2022 走看看