2

正如标题所说,我需要修改通过引用传递的数组的i第 th元素......

我有以下情况:

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

由于array被声明为指向节点的指针类型,因此参数*(array+0)(其计算结果为*array)是指向节点的类型。所以你应该声明

function1(Node *array, int i)

如果您想array在函数中将其视为指向节点的类型指针。

于 2012-04-22T20:04:33.450 回答
1

我认为你function1的设计不正确。我不会尝试传递索引,而是简单地传递i-th 元素。

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

并这样称呼它:

function1(array[i]);

你真的应该改掉使用+运算符作为索引数组的方法的习惯。使用索引[]语法。我知道它们可以互换,但索引语法传达了意图。


在评论中,您声明该索引实际上仅在内部已知function1,实际上不是问题中所述的参数。在这种情况下,传递Node**function1.

您的带有 reference 参数的代码会修改array[0],因为这Node*是您传入的引用。但是您想修改i-th 节点。如果您传递对 a 的引用,Node*那么您只能修改该对象。为了做你需要的事情,你需要通过Node**.

于 2012-04-22T20:14:30.830 回答
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 回答