4

我有一个特定的结构structX和一个包含这些结构的二维数组。

我希望能够保存指向该 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
{
...
}

我希望我能理解,正如我所说,这是非常笼统的。

如何进行迭代?意思是没有错误?

谢谢!

4

2 回答 2

2

我可以在您的代码中注意到两个问题if(ptr[x][y] == OK)

(1):

ptr是指向结构(单 *)的指针,你不能使用双索引[][] ,所以在if(ptr[x][y] == OK)

错误,下标值既不是数组也不是指针,因为ptr[][]

(2):

错误:使用了需要标量的结构类型值意味着 if(struct are not allow).

if(should be a scalar value )

标量值意味着可以转换成0/1.

指向二维结构数组 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  

编辑

错误:使用了需要标量的结构类型值意味着 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);
于 2013-03-04T18:09:01.883 回答
2

您可能希望准备好这篇关于多维数组的文章。如果你想迭代一个数组,你需要知道它有多大(它是否是动态的)。如果您希望它是动态的,这意味着您需要在它需要增长时为其分配内存并且您需要释放旧内存。您的问题也有问题 - 您声明了一个空指针,然后尝试取消引用它,但您从未为它分配内存。

如果你确实为它分配了内存,你可以通过说

ptr[x * ROW_WIDTH + y]

如果将 ROW_WIDTH 设置为 y 的最大值。根据您要表示主要行还是主要列数组,您可以使用 y * width 而不是 x * width。

于 2013-03-04T19:33:03.207 回答