4

動的変数を作成し、そのアドレスを関数内で参照渡ししようとしていますnew_testが、うまくいきません。私は何を間違っていますか?

コード:

#include <iostream>
using namespace std;

struct test
{   
    int a;
    int b;
};  

void new_test(test *ptr, int a, int b)
{   
    ptr = new test;
    ptr -> a = a;
    ptr -> b = b;
    cout << "ptr:   " << ptr << endl; // here displays memory address
};  

int main()
{   

    test *test1 = NULL;

    new_test(test1, 2, 4); 

    cout << "test1: " << test1 << endl; // always 0 - why?
    delete test1;

    return 0;
}
4

2 に答える 2

8

コードは参照によってポインターを渡さないため、パラメーターへの変更ptrは関数に対してローカルであり、呼び出し元には表示されません。への変更:

void new_test (test*& ptr, int a, int b)
                  //^
于 2013-09-10T14:55:08.720 に答える
1

ここ:

void new_test (test *ptr, int a, int b)
{   
    ptr = new test; //<< Here ptr itself is a local variable, and changing it does not affect the value outside the function
    //...

ポインター値自体を変更しているため、ポインターへのポインター、またはポインターへの参照が必要です。

ポインターのポインター:

void new_test (test **ptr, int a, int b)
{   
    *ptr = new test;
    (*ptr) -> a = a;
    (*ptr) -> b = b;
    cout << "ptr:   " << *ptr << endl; // here displays memory address
}

次を使用して呼び出します。

new_test (&test1, 2, 4);

ポインターへの参照:

void new_test (test *& ptr, int a, int b) {/.../ }

プログラムの読み取りと追跡が困難になるため、ポインターと参照を混在させることはお勧めしません。しかし、それは個人的な好みです。

于 2013-09-10T15:09:25.410 に答える