• 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
  • 相关阅读:
    bzoj1002/luogu2144 轮状病毒 (dp)
    bzoj1003/luogu1772 物流运输 (dijkstra+dp)
    bzoj1007/luogu3194 水平可见直线 (单调栈)
    [模板]群论
    http 协议媒体格式
    java加密类支持sha256,md5,HmacSha1,base64
    java逐行读写借助buffereader/bufferwriter
    java 基础io读写字节以及缓存读写字节
    java log4i.properties
    java 迭代器
  • 原文地址:https://www.cnblogs.com/code-wangjun/p/9339851.html
Copyright © 2020-2023  润新知