2015-09-11 24 views
0

我閱讀本C++ tutorial,並且在指針部分有一個令人困惑的例子,正是這一點:動態存儲器分配和指針非字符數組類型

double (*pVal2)[2]= new double[2][2]; //this will add 2x2 memory blocks to type double pointer 
*(*(pVal2+0)+0) = 10; 
*(*(pVal2+0)+1) = 10; 
*(*(pVal2+0)+2) = 10; 
*(*(pVal2+0)+3) = 10; 
*(*(pVal2+0)+4) = 10; 
*(*(pVal2+1)+0) = 10; 
*(*(pVal2+1)+1) = 10; 
*(*(pVal2+1)+2) = 10; 
*(*(pVal2+1)+3) = 10; 
*(*(pVal2+1)+4) = 10; 

int (*pVal)[2]數組指針? 我不明白爲什麼它爲double[2][2]分配內存,但*(*pVal2+1)+4)是4?

+2

'int(* pVal)[2]'是一個指向2個整數的指針。你能更具體地瞭解「發生了什麼」嗎?該教程看起來很差,這可能是一個想法,避開它。 – juanchopanza

+0

動態分配內存時不應該爲double [2] [5]分配嗎? – ner0x652

+0

@ ner0x652你的意思是'double [5] [2]'?無論哪種方式,仍然不會使其餘的代碼有效...... – Barry

回答

2

使用螺旋的規則:

 +--------+ 
     | +---+ | 
     |^ | | 
double (*pVal2)[2]; 
^ ^ | | 
|  +-----+ | 
+---------------+ 

pVal2是指向2 double秒的陣列。或者,更簡單:

using T = double[2]; 
T *pVal2 = new T[2]; 

的其餘代碼導致未定義行爲:*(p + idx)相當於p[idx],所以*(*(pVal2+1)+4)相當於pVal2[1][4]。但的pVal2[1]類型是double[2],所以有沒有第五元素...