C++ 指针形参和指针引用形参的原理分析

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

二者的最大区别也很简单,若是该函数的参数只是读的话,值传递就能够知足。若是该函数的参数须要进行修改并返回的时候,就应该进行引用传递。测试

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

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)函数同样。code

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

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
相关文章
相关标签/搜索