指向2D结构数组C的指针

时间:2013-03-04 17:57:54

标签: c arrays pointers 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
{
...
}

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

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

谢谢!

2 个答案:

答案 0 :(得分: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.

指向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  

编辑

错误:使用了需要标量的结构类型值表示 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);

答案 1 :(得分:2)

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

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

取消引用它
ptr[x * ROW_WIDTH + y]

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