用于更改数组值的指针算法

时间:2012-04-23 16:19:12

标签: c++

这是对早期问题的后续问题。

我已经学会了一些错误,但还有其他问题。我的目标是让一个方法中的局部数组从另一个方法改变而不使用任何全局变量。

void methodOne(){

        int myArray[10] = {0};
        int *pMyArray = myArray;

        methodTwo(&*pMyArray);
}

这应该声明一个空值数组并将引用传递给第二个数组,因为我看到了如何正确地here

void methodTwo(int *passedPointer){

        int *localPointer =  passedPointer;

}

接下来我想从methodTwo更改myArray的值。因此,要更改第一个[0]元素,我会说:

*localPointer  = 1;

这是对的吗?

然后要更改下一个元素,我会使用:

递增指针
localPoint++;
*localPointer = 2;

这会改变myArray中的第二个值吗?我不确定这是正确的方法吗?

TIA

3 个答案:

答案 0 :(得分:1)

是的,这一切看起来都应该有效。通常,当您将数组传递给函数时,首先不要分配给局部变量 - 您只需将数组的名称作为参数传递:methoTwo(myArray);。编译器会自动将数组名称转换为指向数组开头的指针。

另请注意,您可以在接收端使用数组样式表示法,例如:

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

...也是合理的,并且会像你的

一样完成
*localpointer = 1;
++localpointer;
*localpointer = 2;

对于它的价值,另一种选择是:

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

答案 1 :(得分:0)

首先,您错误地传递了数组。数组只不过是指向第一个元素的指针,因此您无需将其地址传递给MethodTwo。但是,您应该做的是将该数组中的元素数传递给MehtodTwo

 methodTwo(MyArray, 10);

由于数组只是指向第一个元素的指针,因此您可以直接索引到数组中而无需使用指针算术:

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

  passedArray[0] =  passedPointer;

}

答案 2 :(得分:0)

不,这是错的。非常错误。数组指针衰减真的非常糟糕,你永远不应该使用它。使用基于类的包装器,如std::array,并将一对迭代器传递给MethodTwo。