C语言中指向二维结构体数组的指针

4

我有一个叫做 structX 的结构体和一个二维数组,其中包含这种类型的结构体。

我希望能够保存指向该二维结构体的指针,并以动态方式迭代它,也就是说,该指针可以保存任何 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
{
...
}

我希望你能理解我的意思,正如我所说的,这是非常普遍的问题。
如何进行迭代?意思是不出错?
谢谢!

1
所以基本上...你的问题是如何使用指向二维数组的指针? - StoryTeller - Unslander Monica
@StoryTeller 我认为在头文件中已经很好地定义了... - Itzik984
@Itzik984 请检查一下我的答案吧? - Grijesh Chauhan
@Grijesh Chauhan 当然没问题!谢谢,让我检查一下。大约需要几分钟。 - Itzik984
1
标题只是凡人所用,我仅根据内容进行评论 :P - StoryTeller - Unslander Monica
显示剩余2条评论
2个回答

2

您可能需要阅读关于多维数组的这篇文章。如果您想迭代一个数组,您需要知道它有多大(无论它是动态还是静态)。如果您想要它是动态的,那就意味着在它需要增长时您需要为其分配内存并释放旧内存。此外,您在问题中也存在一个问题——您声明了一个初始化为空的单个指针,然后尝试对其进行解引用,但您从未为其分配内存。

如果您已经为其分配了内存,那么可以通过以下方式来对其进行解引用:

ptr[x * ROW_WIDTH + y]

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


2

我注意到您的代码中存在两个问题:

(1):

ptr是指向结构体的指针(single *),因此不能使用双重索引[][],所以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(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);

由于某种原因,使用(ptr2D)[r][c] = i;而不加上*可以工作,而你的代码则不行。我得到了一个“在需要标量的地方使用结构体类型值”的错误信息,你有什么想法吗?我是这样做的:if((ptr)[x][y])...,它可以工作。 - Itzik984
当我们想要动态分配二维内存时应该怎么做?即,在声明时未知行数和列数。 - jjm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接