2012-12-10 153 views
2

我已經買了visual C++的初學者書,並且涉及到涉及數組,字符串和指針的章節。我理解這個概念,但是當涉及到多維數組時,我有點失落。C++ - 多維數組中的指針

陣列和和指針聲明:

double beans[3][4]; 
double* pbeans; 

我理解這部分:

*您可以聲明並賦值爲指針pbeans,如下:

double* pbeans; 
pbeans = &beans[0][0]; 

但當作者提出您可以通過鍵入此聲明來指定第一行/維度的地址時,他會丟失我:

pbeans = beans[0]; 

爲什麼我們可以跳過這裏的「Address-Of」運算符? 對我來說順理成章的事情是:

pbeans = &beans[0]; 
+2

[This FAQ](http://stackoverflow.com/q/4810664/1202636)是非常有用的,如果你與陣列,指針和theri關係戰鬥。 – effeffe

+1

退房http://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory – devshorts

回答

0

因爲數組衰減到指向第一個元素的指針。如果我們有一個名爲arr的數組,那麼數組將不適合的任何使用arr通常會導致arr被視爲指針。這被稱爲衰變。在此情況下,beans[0]是數組;具體而言,是double[4]。但是,由於您不能將數組分配給指針,因此數組會衰減爲double*

您提供的代碼double* pbeans = &beans[0];會嘗試將指向雙精度數組的指針指向double的指針;由於類型不匹配而無法工作。另外,所有這一切,這聽起來不像一本很好的書;教學陣列,字符串和指針一起C的氣味。

+0

啊我想我明白了......感謝快速回應:) – Mogash

0

假設你有隻是一個數組

double legumes[5]; 

數組衰變爲指針,所以你可以做

double* plegumes = legumes; 

當你聲明一個二維數組,你正在做的是創建一個數組數組。所以表達式beans[0]實際上是指一個數組。所以聲明

pbeans = beans[0]; 

只是將一個數組分配給一個指針。

0

在數組類型和指向數組第一個元素的指針之間存在標準轉換。作爲一個簡單的例子:

int array[5]; 
int* p = array; 

p現在是指向的array的第一要素,因爲類型的對象「5 INT的數組」將衰變到一個「指針int」,如果他們需要。

在你的情況下,beans[0]的類型是「array of 4 double」,並且會衰減成指向double的指針,指向beans[0]數組中的第一個元素。這相當於做double* p = &beans[0][0]