簡體   English   中英

如何使用C中的宏將int指針作為2D數組訪問?

[英]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 == 2C == 3 ):

   +---+                +---+
b: |   | b[0] -----> a: |   | a[0]
   +---+                +---+
   |   | b[1] ---+      |   | a[1]
   +---+         |      +---+
                 |      |   | a[2]
                 |      +---+
                 +----> |   | a[3]
                        +---+
                        |   | a[4]
                        +---+
                        |   | a[5]
                        +---+

這樣,您可以使用b[i][j]訪問ab[i][j] == a[i * R + j] )中的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM