2015-10-05 63 views
0

我有一個數組我怎麼能像這樣訪問它:*A+i*blockSize*dimenson?這不是轉化爲A[i*blockSize*n]嗎?使用指針算術訪問二維數組

這怎麼可能如果i*blockSize*n是一個比n大的數字?我以爲它是有效的,因爲C中的二維數組實際上只是一塊連續的內存。但是,這並不會改變我無法編碼A[i*blockSize*n][j] = something而沒有發生運行時錯誤的事實。

那麼,爲什麼*A+i*blockSize*dimenson確定,但不A[i*blockSize*n]

我希望這個問題是有道理的人誰是在C語言的專家..

回答

-1

第一:

*(A+i*blockSize*dimenson) 

翻譯成:

A[i*blockSize*dimenson] 

而你根本做不到:

A[i*blockSize*n][j] = something 

如果i*blockSize*nn更大,因爲你會得到了你分配的數組,由n是大小爲n的界限的。

但你可以這麼做:

A[i][j] 

爲:

B[i*n+j] 

如果聲明B中的一維數組指向,例如:

int A[n][n]; 
int * B = (int *)A; 
+0

*如果您將'B'聲明爲指向'A'的單維數組*您將如何做?這個'*(A + i * blockSize * dimenson)'不在公佈的例子中。 –

+0

我剛剛添加括號以清除運算符優先級,這與'* A + i * blockSize * dimenson'的例子相同。我還編輯瞭如何聲明這一點。 – lilezek

+0

這是不一樣的,請閱讀我的答案。 '*'([* dereference operator *](https://cs50.harvard.edu/resources/cppreference.com/operator_precedence.html))在涉及表達式的所有操作符中具有最高優先級。另外,雖然第二部分在技術上是正確的(它可以正常工作),但不存在*將'B'聲明爲一維數組**,將**指向'A' *。 –

0

隱而不宣」 t翻譯爲A[i * blockSize * n]

不,它沒有你有什麼是

*A + i * blockSize * dimenson 

實際上相當於

A[0] + i * blockSize * dimension 

您需要了解operator precedence,正確的對應表達

*(A + i * blockSize * dimenson) 

但這是沒有必要的,因爲它會讓代碼更難閱讀而不會給你帶來任何好處。


請使用周邊爲運營商的空間,這樣很容易操作符和操作數來區分。