我注意到您的代码中存在两个问题:
(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);