1. 程式人生 > >C/C++指針參數賦值問題

C/C++指針參數賦值問題

.cn logs class c++ 就是 指針 問題: 找到 解決

  今天遇到一個問題,即在C/C++中,關於在函數裏對指針賦值的問題。首先可以看到如下現象:

void test(int *p)
{
    p = NULL;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int *t , y = 10;
    t = &y;
    test(t);

    return a.exec();
}

  技術分享圖片

  這個結果令我有點吃驚,我一直以為傳遞指針,賦值完這個指針也會變的,沒想到其實指針也是一個變量,我們如果要改變它,必須找到它在內存中的地址,也就是指針的地址。也就是說,對於函數中,如果對指針的地址進行賦值,事實上是改變不了原指針的!

void test(int **p)
{
    *p = NULL;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int *t , y = 10;
    t = &y;
    test(&t);

    return a.exec();
}

  技術分享圖片

另外,用引用賦值也可以解決這個問題:

void test(int &p)
{
    int n = 9;
    p = n;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int t , y = 10;
    t = y;
    test(t);

    return a.exec();
}

  技術分享圖片

  另外,可以修改指針指向的內容,而不是修改指針地址,也可以改變內容。

  例子1:

void test(int *p)
{
    int n = 9;
    *p = n;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int *t , y = 10;
    t = &y;
    test(t);

    return a.exec();
}

  技術分享圖片

  例子2:

void test(int *p)
{
    int n = 9;
    *p = n;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int t , y = 10;
    t = y;
    test(&t);

    return a.exec();
}

  技術分享圖片

C/C++指針參數賦值問題