2017-09-08 34 views
-1

配列と配列のサイズを引数として受け入れる関数を書く必要があります。この関数は、引数配列の2倍の新しい配列を作成する必要があります。関数は引数配列の内容を新しい配列にコピーし、 - で第2配列の未使用要素を初期化する必要があります。関数は新しい配列へのポインタを返さなければなりません。 これは私が完了する必要があるプロンプトです。私は関数内で必要な配列を取得しますが、main関数には持ち込まれていません。関数の戻り値が返されていません

void moveOver(int *arr, int size) 
{ 
    int *arrp=nullptr; 
    arrp= new int[size + 1]; 
    //arrp[0] = 0; 
    for (int i = 1; i <= size; i++) 
    { 
     arrp[i] = arr[i-1]; 
    } 
    arr = new int[size + 1]; 
    *arr = *arrp; 
    for (int i = 0; i < size + 1; i++) { 
     //cout << *(arr+i) << endl; 
     cout << arrp[i] << endl; 
    } 

} 
int main() 
{ 
    const int size = 4; 

    int arr[size] = { 1,2,3,4 }, *arrptr=nullptr; 
    arrptr = arr; 
    moveOver(arr, size); 
    for (int i = 0; i <=size ; i++) { 
     cout << arr[i] << endl; 
    } 
    return 0; 
} 

印刷すると、必要な5つではなく4つのインデックスだけが印刷されます。任意のアドバイスをいただければ幸いです。また、私はポインタと配列を使用すると仮定、私はベクトルを使用することはできません

+0

なぜ「arr」に*新しい*メモリを割り当てていますか?以前の配列を上書きする前に、 'arr'からメモリを削除しませんでした。 –

+0

ところで、 '* arr = * arrp;'は最初のスロットだけをコピーします。配列をコピーするには 'std :: copy'が必要です。ベクターは使いやすくなっています。 –

+0

すべての助けをいただきありがとうございます。私はベクターを使いたいと思っていますが、この割り当てでは配列を使用したいと考えています。 –

答えて

3

arrは、moveOver()関数内のローカル変数です。これに割り当てることは、main()の変数には影響しません。 main()では、arrはポインタではなく配列なので、別の配列を指すように再割り当てすることはできません。

moveOver()を変更する必要がありますので参考にしてください。次に、arrptrを渡すと、関数はそれを再割り当てできます。

は、あなたが持っているもう一つの問題は、*arr = *arrp;は全体の配列、それだけでコピー配列の最初の要素をコピーしないということであるPass by Reference/Value in C++

を参照してください。しかし、新しい配列をarrに割り当てる必要は全くありません。ポインターをコピーするには、単にarr = arrp;を実行します。

void moveOver(int *&arr, int size) 
{ 
    int *arrp = new int[size + 1]; 
    arrp[0] = 0; 
    for (int i = 1; i <= size; i++) 
    { 
     arrp[i] = arr[i-1]; 
    } 
    arr = arrp; 
    for (int i = 0; i < size + 1; i++) { 
     //cout << *(arr+i) << endl; 
     cout << arrp[i] << endl; 
    } 

} 
int main() 
{ 
    const int size = 4; 

    int arr[size] = { 1,2,3,4 }, *arrptr=nullptr; 
    arrptr = arr; 
    moveOver(arrptr, size); 
    for (int i = 0; i <= size ; i++) { 
     cout << arrptr[i] << endl; 
    } 
    return 0; 
} 
+0

ありがとうございました!私はあなたが '&'を入れなければならないことを理解していませんでした。私はあなたが両方とも*と同時に、互いに打ち消し合うと思っていることも知りませんでした。助けてくれてありがとう、ごめんなさい、私に6通の通知をしたら、誤って入力ボタンを2回押しました。 –

+0

参照と値渡しの違いを説明する別の質問へのリンクを追加しました。 – Barmar

+1

'*'と '&'は演算子として使用されているときにのみ互いに​​キャンセルします。宣言には全く異なる意味があります。 – Barmar

関連する問題