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
相關文章
相關標籤/搜索