2

タイトルが示すように、参照渡しされた配列のith要素を変更する必要があります...

次のような状況があります。

function1(Node *&array, int i) {
   array = array +i; // crash!!!
   // operation on array[i]
}

function2() {
   Node** array;
   // filling the array bla bla bla
   function1(*(array+0), i);
}

問題は、私が書いているときに何が間違っているのですarray = array +i;か???

前もって感謝します!

4

3 に答える 3

1

function1あなたの設計は間違っていると思います。インデックスを渡そうとするのではなく、単純にi-th 要素を渡します。

function1(Node* array) {
    array->foo = ....
}

次のように呼び出します。

function1(array[i]);

+配列にインデックスを付ける手段として演算子を使用する習慣から抜け出す必要があります。インデックス[]構文を使用します。それらが交換可能であることは知っていますが、インデックス構文は意図を伝えます。


コメントでは、インデックスは実際には内部function1でのみ知られており、実際には質問に記載されているパラメーターではないと述べています。その場合、 に渡しNode**ますfunction1

参照パラメーターを使用したコードは、渡しarray[0]た参照であるため変更されます。しかし、 -th ノードNode*を変更したいとします。iへの参照を渡すと、Node*その 1 つのオブジェクトのみを変更できます。必要なことを行うには、 を渡す必要がありますNode**

于 2012-04-22T20:14:30.830 に答える
1

arrayはポインタからノードへのポインタ型として宣言されているため、引数(*(array+0)に評価される*array) はノードへのポインタ型です。だから宣言すればいい

function1(Node *array, int i)

array関数内でノードへのポインタ型として扱いたい場合。

于 2012-04-22T20:04:33.450 に答える
0

配列要素を変更しようとしていると仮定すると、変更する配列要素へのポインターまたは参照を渡すだけで済みます。

例1:操作する要素への参照を渡します。

function1(Node &element) {
   // operation on element
}

function2() {
   Node** array;
   // filling the array bla bla bla
   function1(array[0][i]);
}

例2:操作する要素へのポインターを渡します。

function1(Node *element) {
   // operation on *element
}

function2() {
   Node** array;
   // filling the array bla bla bla
   function1(*array + i);
}

例3:要素の配列とインデックスへのポインタを渡します。

function1(Node *array, int i) {
   Node *element = array + i;
   // operation on *element
}

function2() {
   Node** array;
   // filling the array bla bla bla
   function1(*array, i);
}

例4:例3と同じですが、ローカル参照を使用します。

function1(Node *array, int i) {
   Node &element = array[i];
   // operation on element
}

function2() {
   Node** array;
   // filling the array bla bla bla
   function1(*array, i);
}

例5:例3と同じですが、パラメーターをローカル変数として再利用します。これは、配列が参照ではないためにのみ機能することに注意してください。おそらくこのスタイルは避けるべきです。

function1(Node *array, int i) {
   array += i;
   // operation on *array
}

function2() {
   Node** array;
   // filling the array bla bla bla
   function1(*array, i);
}
于 2012-04-22T20:53:46.060 に答える