正如标题所说,我需要修改通过引用传递的数组的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;
???
提前谢谢!
答案 0 :(得分:1)
由于array
被声明为指向节点的指针类型,因此参数*(array+0)
(计算结果为*array
)是指向节点的类型指针。所以你应该声明
function1(Node *array, int i)
如果你想将array
视为函数中类型指针的类型。
答案 1 :(得分:1)
我认为您的function1
设计不正确。我只是传递i
- 元素,而不是尝试传递索引。
function1(Node* array) {
array->foo = ....
}
并将其称为:
function1(array[i]);
你真的应该放弃使用+
运算符作为索引数组的方法的习惯。使用索引[]
语法。我知道它们可以互换,但索引语法传达了意图。
在评论中,您声明索引实际上只在function1
内知道,并且实际上不是问题中所述的参数。在这种情况下,请将Node**
传递给function1
。
带有引用参数的代码会修改array[0]
,因为这是您传入的Node*
引用。但是您想要修改i
个节点。如果您将引用传递给Node*
,则只能修改该对象。为了满足您的需求,您需要通过Node**
。
答案 2 :(得分: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);
}