0

配列のサイズを変更する関数を見つけましたが、それがどのように機能するか (または正しく機能しているかどうか) を理解するのに苦労しています。テストのために、「temp」配列を新しい値に設定すると、「startCounter」がその値に割り当てられますが、startCounter のメモリ位置は変わりません。これが私のコードです:

int * startCounter;


void resizeArray(int *&arraySent,int origSize,int newSize) {
    output << "&arraySent " << &arraySent << endl;
    output << "arraySent[0] " << arraySent[0] << endl;
    int* temp = new int[newSize];
    output << "&temp " << &temp << endl;
    for (int i=0; i<origSize; i++) {
        temp[i] = arraySent[i];
    }
    temp[0]=744;
    delete [] arraySent;
    arraySent = temp;
    output << "&arraySent " << &arraySent << endl;
}

//....

startCounter = new int [3];
startCounter[0]=345;
output << &startCounter << endl;
resizeArray(startCounter,3,10);
output << "startCounter[0]" << startCounter[0] << endl;
output << "&startCounter" << &startCounter << endl;

これから得られる出力は次のとおりです。

    &startCounter 0x60fab8
    &arraySent 0x60fab8
    arraySent[0] 345
    &temp 0x82cfe54
    &arraySent 0x60fab8
    startCounter[0] 744
    &startCounter 0x60fab8

私の質問は、startCounter を削除して新しい「一時」配列に割り当てた後、startCounter のメモリ位置が 0x60fab8 から変更されないのはなぜですか? 0x82cfe54 になるべきではないでしょうか。

PS私はベクトルなどについて理解していますが、主にこの特定の機能がどのように機能するかを理解することに関心があります。

4

2 に答える 2

2
void resizeArray(int *&arraySent,int origSize,int newSize) {
    output << "&arraySent " << &arraySent << endl;

保持しているアドレスではなく、ポインタ変数のアドレスを出力します。

(おそらく)意図した効果を得るためにアドレス演算子を単に省略します

于 2012-10-05T23:59:39.957 に答える
1

&startCounterポインタのアドレスであり、ポインタが指すアドレスではありません。その価値は変わりません。単に使用してstartCounterください。

于 2012-10-06T00:00:02.070 に答える