0

これは以前の質問に続く質問です。

私は自分のやり方のいくつかの誤りを学びましたが、追加の質問があります。私の目的は、グローバル変数を使用せずに、あるメソッドのローカル配列を別のメソッドから変更することです。

void methodOne(){

        int myArray[10] = {0};
        int *pMyArray = myArray;
        
        methodTwo(&*pMyArray);
}

ここで正しく行う方法を示したように、これは null 値の配列を宣言し、2 番目の配列への参照を渡す必要があります。

void methodTwo(int *passedPointer){
       
        int *localPointer =  passedPointer;

}

次に、myArray の値を methodTwo から変更したいと思います。したがって、最初の[0]要素を変更するには、次のように言います。

*localPointer  = 1;

これは正しいです?

次に、次の要素を変更するには、次を使用してポインターをインクリメントします。

localPoint++;
*localPointer = 2;

これは myArray の 2 番目の値を変更しますか? それが正しい方法かどうかわかりませんか?

ティア

4

3 に答える 3

1

はい、これはすべてうまくいくようです。通常、配列を関数に渡すときは、最初にローカル変数に代入しません。配列の名前をパラメーターとして渡すだけですmethoTwo(myArray);。コンパイラは、配列の名前を配列の先頭へのポインターに自動的に変換します。

また、受信側で次のような配列スタイルの表記を使用できることにも注意してください。

localpointer[0] = 1;
localpointer[1] = 2;

...も合理的であり、あなたと同じことを達成します

*localpointer = 1;
++localpointer;
*localpointer = 2;

それだけの価値があるため、別の代替手段は次のようになります。

*localpointer++ = 1;
*localpointer = 2;
于 2012-04-23T16:24:16.907 に答える
0

いいえ、これは間違っています。大きな過ち。配列からポインターへの減衰は本当に、本当に悪いので、絶対に使用しないでください。のようなクラスベースのラッパーを使用し、std::array反復子のペアを MethodTwo に渡します。

于 2012-04-23T16:30:38.943 に答える
0

まず、配列を間違って渡します。配列は最初の要素へのポインタにすぎないため、に渡すためにそのアドレスを取得する必要はありませんMethodTwo。ただし、すべきことは、その配列の要素数を次のように渡すことですMehtodTwo

 methodTwo(MyArray, 10);

配列は最初の要素へのポインターに他ならないため、ポインター演算を使用せずに配列に直接インデックスを付けることができます。

void methodTwo(int passedArray[], size_t n)
// alternative void methodTwo(int *passedArray, size_t n)
{

  passedArray[0] =  passedPointer;

}
于 2012-04-23T16:26:08.843 に答える