2014-12-05 63 views
0

指針運算這是我的第一個問題:)多維數組方式

double MyArray[][6]; 
double* Myptr = MyArray[0]; 

所以我一直在想,爲什麼在指針運算,我可以譜寫指針在這樣的單一維度移動,

*(Myptr + i); 

,但如果我試圖通過使用for循環數組的尺寸來移動它不會讓我

*(*(Myptr + i) + j); 

但它確實讓我使用這個表示法與數組本身。

*(*(MyArray + i) + j); 

我想知道爲什麼這是一個限制?或者我可能寫錯了。

回答

0

Myptr是一個雙倍指針,所以*(Myptr + i)是一個雙精度值,雖然你可以添加j到那,你不能解引用結果。

了的聲明Myptr這樣的:

double (*Myptr)[6] = MyArray; 

然後Myptr將是一個指向的6 double秒的陣列。因此*(Myptr + i)將是double[6],並且該表達式將起作用。

,您可以使用此語法數組索引是不幸奇怪的人誰看到它第一次,從來沒有被教導有關指針腐爛。關於C和C++數組的一個有趣的事情是,它們在幾乎所有情況下都會衰減爲指針。這意味着幾乎總是在使用數組時(存在異常),數組將隱式轉換爲指向其第一個元素的指針,其餘部分則使用指針算術完成。

例如,當您編寫MyArray[i]時就是這種情況。該標準將MyArray[i]定義爲*(MyArray + i)(該標準使用更多的括號,但這是歸結爲什麼),這在您明白衰變爲指針,i被添加到該指針並且得到的指針被解除引用時有意義。這也解釋了爲什麼i[MyArray]同樣有效(如果風格不好)。

在多維數組的上下文中,重要的是理解多維數組僅僅是數組的數組是重要的。 就你而言是一個雙精度數組數組。那麼,MyArray[0]是一個雙打數組。在指針衰減,衰減的指針雙打的陣列,而當你解引用該指針與數組工作,它指向,然後陣列也衰減到指針(加倍),當您使用它。它一直在衰減。

+0

謝謝,並感謝大家:) – 2014-12-05 14:37:51

0

在這種情況下,MyPtr只是一維的,因爲它被分配到MyArray中的特定「數組」。

+0

哦..我明白了,所以指針實際上可以移動到二維陣列中,但是就像一維一樣。 這意味着*(Myptr + i);我能覆蓋整個多陣列嗎? – 2014-12-05 13:56:48

+0

Nevermind我沒有考慮到MyPtr是一個雙指針。查看其他答案。但最有可能的是你的評論。 – 2014-12-05 13:59:23

-1

因爲Myptrdouble*。一個指向double的指針。它不知道數組的大小。

+0

你能提出一個建議,我怎樣才能讓我的指針具有其他維度的知識? – 2014-12-05 13:51:47

0

MYARRAY有類型double[][6]和MyPointer的類型爲double*

現在數組和指針是不同的,但在這種情況下這並不重要。這兩個變量在其類型中都有數組/指針,但My Array有兩個(計數它們:[][6]),MyPointer只有一個(計數:*)。這就是爲什麼您可以向MyArray應用兩次解除引用(即*運算符)並僅向MyPointer應用一次。現在

,如果你想有一個可以在很大程度上被用於使用MYARRAY以同樣的方式的指針,這是可能的,但它的類型將不會double**(因爲數組和指針不同)。你寫這樣說:

double (*MyPointer2)[6] = MyArray; 

這其中有在其兩型數組/指針一樣的東西,所以你可以申請取消引用兩次以它。