指针通过引用传递参数的算术

时间:2012-04-22 20:00:19

标签: c++ math pointers reference

正如标题所说,我需要修改通过引用传递的数组的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; ???

时,我做错了什么

提前谢谢!

3 个答案:

答案 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);
}