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

Pointer arithmetic to change array values

本文关键字:指针 数组 用于      更新时间:2023-10-16

这是对前一个问题的后续问题。

我学到了一些错误,但有额外的问题。我的目标是在不使用任何全局变量的情况下,将一种方法中的局部数组从另一种方法更改。

void methodOne(){
        int myArray[10] = {0};
        int *pMyArray = myArray;
        
        methodTwo(&*pMyArray);
}

这应该是声明一个 null 值数组并将引用传递给第二个数组,正如我在这里看到如何正确执行此操作一样。

void methodTwo(int *passedPointer){
       
        int *localPointer =  passedPointer;
}

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

*localPointer  = 1;

这是对的吗?

然后要更改下一个元素,我将使用以下方法递增指针:

localPoint++;
*localPointer = 2;

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

蒂亚

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

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

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

。也是合理的,并且会完成与您的

相同
*localpointer = 1;
++localpointer;
*localpointer = 2;

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

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

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

 methodTwo(MyArray, 10);
由于数组只

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

void methodTwo(int passedArray[], size_t n)
// alternative void methodTwo(int *passedArray, size_t n)
{
  passedArray[0] =  passedPointer;
}

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