2012-04-23 49 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。