2012-04-23 47 views
0

这是前面提到的一个问题。用于更改数组值的指针算术

我已经学会了一些我的方式的错误,但有额外的问题。我的目标是在不使用任何全局变量的情况下从另一个方法更改一个方法中的本地数组。

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

+0

当你尝试时发生了什么? – 2012-04-23 16:22:08

+0

只需使用'localPointer [i]'进行访问。 – 2012-04-23 16:22:32

回答

1

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

还要注意的是,你可以在接收端采用阵列式符号,是这样的:

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

...也是合理的,将完成与您的

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

对于什么是价值,另一种方法是:

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

我从来不知道你可以使用带数组表示法的指针。这使它更容易。 TY。 – 2012-04-23 16:33:14

+0

@EricBanderhide:烨 - Visual C表示,'*(指针+偏移)'相当于'指针[偏移]'。 – 2012-04-23 16:34:23

0

首先,错误地将数组。一个数组只不过是一个指向第一个元素的指针,所以你不需要把它的地址传递给MethodTwo。但是,你应该做的,是在数组中元素的个数传递给MehtodTwo

methodTwo(MyArray, 10); 

由于数组是不是一个指针的第一个元素没有什么其他的,可以直接索引到阵列,无需使用指针算法:

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

    passedArray[0] = passedPointer; 

} 
0

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