我有一个结构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
{
...
}
我希望我能理解,正如我所说,这是非常笼统的。
如何进行迭代?意思是没有错误?
谢谢!
答案 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.
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。