[英]How to access a int pointer as 2D array using macros in C?
如果R是我的行號,C是我的列號,我將初始化一個指針,如下所示:
int * a = (int*) malloc(R*C*sizeof(int));
然后訪問第二行中的第二個元素:
a[1*c + 1]
我想模擬2D arr。
我如何制作一個將其轉換為a[i][j]
到此a[i*c + j]
的宏?
宏無法讀取和轉換方括號。 但是你可以這樣寫:
int (*b)[C] = (void *)a;
然后可以使用b[i][j]
,其含義與a[i*C + j]
。
如果您不希望為每個可能使用的動態數組使用單獨的宏,則將需要一些通用的內容。 例如:
#define INDEX_2D(array, i, j, j_sz) array[ (i) * (j_sz) + (j) ]
然后,您可以像這樣使用它:
INDEX_2D(my_array, row, col, C) = x;
printf("%d\n", INDEX_2D(my_array, row, col, C));
不過,這似乎很笨拙。 如果您不能使用實際的2d數組,為什么不只使用簡單的索引計算,實際上似乎更清楚?
my_array[row * C + col] = x;
printf("%d\n", my_array[row * C + col]);
預處理程序不是偽造1D陣列上2D陣列訪問的好工具。 另一種方法是在1D數組中創建一個指針數組,如下所示:
int *a = malloc( R * C * sizeof *a ); // do not cast the result of malloc!
int *b[] = { &a[0], &a[C], &a[2*C], ..., &a[(R-1) * C] };
結果類似於以下內容(假設R == 2
和C == 3
):
+---+ +---+
b: | | b[0] -----> a: | | a[0]
+---+ +---+
| | b[1] ---+ | | a[1]
+---+ | +---+
| | | a[2]
| +---+
+----> | | a[3]
+---+
| | a[4]
+---+
| | a[5]
+---+
這樣,您可以使用b[i][j]
訪問a
( b[i][j] == a[i * R + j]
)中的元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.