我试图将指针传递给结构数组,但数组是用两种不同的方式定义的。我正在努力理解每种情况下使用哪种语法以及原因。 当我尝试使用 GCC 编译它时,我收到以下错误消息。我本以为 aZ 和 bZ 本质上是相同的,并且每个的语法本质上是相同的,但事实并非如此。我应该如何思考这个问题? 我尝试了不同的方法来定义指向两个“等效”变量的指针,并将这些指针传递给函数。 我找到了一种有效的方法,但我不知道为什么。
struct z_st {int i ; char c ; } ;
typedef struct z_st Zarr_k[10] ;
int foo( Zarr_k *pz ) {
return (*pz)[0].i++ ; // pz->[0].i gives an error
}
int bar ( struct z_st barz[10] ) {
return barz[0].i ;
}
int main (int argc, char *argv[] ) {
int ra,rb ;
struct z_st aZ[10]; // aZ is a 10-array of structs type z_st
Zarr_k bZ ; // bZ is a
struct z_st *paz = &aZ[0] ; // &az does not work; incompatible pointer type
Zarr_k *pbz = &bZ ; // &bZ[0] does not work; incompatible pointer type
ra = foo(paz) ; // gives compile error/warning.
rb = foo(pbz) ; // Ok
ra = bar(paz) ; // OK
rb = bar(pbz) ; // error
return 0 ;
}
>
struct_type_clash.c:16:18:警告:从不兼容的指针类型[-Win兼容指针类型]传递“foo”的参数1
16 | ra = foo(paz) ; // 给出编译错误/警告。 | ^~~ | | 结构 z_st * struct_type_clash.c:4:18:注意:预期为“struct z_st (*)[10]”,但参数的类型为“struct z_st *” 4 | int foo( Zarr_k pz ) { | ~~~~~~~~~^~ struct_type_clash.c:19:18:警告:从不兼容的指针类型传递“bar”的参数 1 [-Win兼容指针类型] 19 | 19 rb = 条(pbz) ; // 错误 | ^~~ | |结构 z_st ()[10] struct_type_clash.c:7:23:注意:预期为“struct z_st ”,但参数类型为“struct z_st ()[10]” 7 | int bar ( struct z_st barz[10] ) {
`
`
你写了
*
。
Zarr_k *pz
声明一个指向 10 个结构体数组的指针。 struct z_st barz[10]
作为函数参数声明直接指向结构体的指针,而不是数组;这是因为用数组类型声明的参数被“重写”为指向该数组元素的指针,其方式与数组对象几乎总是转换为指向其第一个元素的指针相同,通常称为“衰减” .
错误消息告诉您这一点,尽管您错误地将其发布为引用的文本而不是代码,导致一些星号消失。
int foo( Zarr_k pz )
给出与当前 bar
相同的类型,即 struct z_st *
int bar ( struct z_st (*barz)[10] )
提供与当前 foo
相同的类型