簡體   English   中英

指向2D結構數組C的指針

[英]Pointer to 2D struct array C

我有一個struct structX和一個包含這些結構的2D數組。

我希望能夠保存指向該2D結構的指針並迭代它

以動態的方式,意思是,指針可以包含任何structX並迭代。

一般行示例:

struct structX *ptr = NULL;

...

  if(i == OK)
    {
        ptr = General_struct_which_holds_others->ptr1;
    }
    else if(i ==NOT_OK)
    {
        ptr = General_struct_which_holds_others->ptr2;
    }

現在迭代:

if(ptr[x][y] == OK) <----Error, subscripted value is neither array nor pointer
{
...
}

我希望我明白,正如我所說,這是非常籠統的。

如何進行迭代? 意思是沒有錯誤?

謝謝!

if(ptr[x][y] == OK)我可以在你的代碼中記下兩個問題

(1):

ptr是指向結構的指針(單*)你不能使用雙索引[][]所以錯誤在if(ptr[x][y] == OK)

錯誤,由於ptr[][] 下標值既不是數組也不是指針

(2):

error:使用了struct type value,其中標量是必需的, 表示 if(struct are not allow)

if(should be a scalar value )

標量值表示可以轉換為0/1.

指向2D結構數組C的指針

struct structX matrix2D[ROW][COL];

它的指針

struct structX (*ptr2D)[ROW][COL];

ptr2D = &matrix2D;

好的,訪問你這樣的數組結構:

struct structX i;
(*ptr2D)[r][c] = i;

如果你想傳入一個函數,請執行以下操作:

void to(struct structX* ptr2D[][COL]){
   struct structX i;
   ptr2D[][COL] = i;
}
void from(){
  struct structX matrix2D[ROW][COL];
  to(matrix2D);
}

只是為了讓你確定我寫了一個簡單的代碼,展示了如何使用ptr2D 希望你覺得它有用:

#include<stdio.h>
#define ROW 10
#define COL 5
typedef struct {
 int a;
 char b;
} structX;
void to(structX ptr2D[][COL], int r, int c){
 printf("in to: %d %c\n", ptr2D[r][c].a, ptr2D[r][c].b);
}
int main(){
 structX matrix[ROW][COL];
 structX (*ptr2D)[ROW][COL];
 ptr2D = &matrix;
 structX  i;
 i.a = 5; 
 i.b = 'a';
 int r = 3;
 int c = 2;
 (*ptr2D)[r][c] = i;
 printf("%d %c\n", (*ptr2D)[r][c].a, (*ptr2D)[r][c].b);
 to(matrix, r, c);
}

它的工作,輸出:

5 a
in to: 5 a

編輯

我想展示兩個技巧,但現在我想我應該提供一個統一的方法( 正如你評論的那樣 ):所以這里是代碼:

#include<stdio.h>
#define ROW 10
#define COL 5
typedef struct {
 int a;
 char b;
} structX;
void to(structX (*ptr2D)[ROW][COL], int r, int c){
 printf("in to: %d %c\n", (*ptr2D)[r][c].a, (*ptr2D)[r][c].b);
}
int main(){
 structX matrix[ROW][COL];
 structX (*ptr2D)[ROW][COL];
 ptr2D = &matrix;
 structX  i;
 i.a = 5; 
 i.b = 'a';
 int r = 3;
 int c = 2;
 (*ptr2D)[r][c] = i;
 printf("%d %c\n", (*ptr2D)[r][c].a, (*ptr2D)[r][c].b);
 to(&matrix, r, c);
}

產量

5 a
in to: 5 a  

編輯

error:使用了struct type value,其中標量是必需的, 表示 if(struct are not allow)

if(should be a scalar value )

你不能這樣做if((*ptr2D)[r][c]);

但這是允許的:

if((*ptr2D)[r][c].a == 5); 

要么

if((*ptr2D)[r][c].b == 'a');  

要么

if((*ptr2D)[r][c].a == 5 && (*ptr2D)[r][c].b == 'a');  

要么

structX  i;
if((*ptr2D)[r][c] == i);

您可能想要准備這篇關於多維數組的文章 如果你想迭代一個數組,你需要知道它有多大(無論它是否是動態的)。 如果您希望它是動態的,那意味着您需要在需要增長時為其分配內存,並且需要釋放舊內存。 您的問題也有問題 - 您聲明一個指針為null,然后嘗試取消引用它,但您從未為其分配內存。

如果你確實為它分配了內存,你可以通過說出來取消引用它

ptr[x * ROW_WIDTH + y]

如果將ROW_WIDTH設置為y的最大值。 根據您是要表示行主列還是列主數組,可以使用y * width而不是x * width。

暫無
暫無

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

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