2017-04-09 46 views
0

我有一個1D數組已被動態分配,我想指向一個雙指針(** ptr),然後將ptr當作一個二維數組,但爲此,應該設置二維數組的寬度,有沒有辦法做到這一點。例如,如果我有一個尺寸爲80的陣列,我想將其視爲一個8 * 10的2D陣列,這樣((ptr)+1)將移動10個單位。我知道我可以手動使用它作爲arr [i row + j],但我寧願以另一種方式做它。謝謝你的幫助!!!如何在c中設置指針的寬度?

+1

'輸入a [80];類型(* b)[10] =(類型(*)[10])a;'使用'b [i] [j]'。 – BLUEPIXY

+0

我可以使用col等變量替換10嗎? (感謝答案btw)。 –

+2

在這個問題中,術語'寬度'和'雙'是不明確的。在C語言環境中,它們通常被理解爲具有不同於此處所設想的含義。在這個問題中你可能很清楚你的意思,但標題本身就是誤導。 – Clifford

回答

3

重新解釋一個一維數組作爲使用指針二維數組:

Type a[80]; 
Type (*b)[10] = (Type (*)[10])a;//or simply (void*)a. b is pointer to Type[10] 

使用b[i][j]

注: 雙指針(等作爲**ptr)基本上是錯誤。通常,該數組不是指針數組。

另外int col = 10; Type (*b)[col] = (Type (*)[col])a;作爲VLA(可變長度陣列)自C99(c11的選項)以來可能。

+0

[DEMO](http://ideone.com/w2Lrcm) – BLUEPIXY

1

除了TYPE*對象之外,您從不指向TYPE**。您沒有任何TYPE*對象。一組TYPE不是其中之一。除了之外,您還可以分配TYPE*的數組,並且將前者的每個元素排列爲指向後者的相關元素。

TYPE* elements = malloc (N_rows * N_cols * sizeof(TYPE)); 
TYPE** rows = malloc (N_rows * sizeof(TYPE*)); 
for (i = 0; i < N_rows; ++i) 
    rows[i] = elements + N_cols * i; 

然而,這是非常低效和不方便的。如果其中一個維度是編譯時常量,或者您可以使用VLA,則可以在不使用任何雙引用的情況下執行此操作(詳細信息請參閱其他答案,以便我不再重複)。

相關問題