struct z_st {int a;字符b}; typedef struct z_st Zarr_k[10];扎尔 aZ;结构 z_st bZ[10; aZ 和 bZ 被认为是不同的类型。为什么?

问题描述 投票:0回答:1

我试图将指针传递给结构数组,但数组是用两种不同的方式定义的。我正在努力理解每种情况下使用哪种语法以及原因。 当我尝试使用 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] ) {

`

`

arrays pointers struct typedef
1个回答
0
投票

你写了

*

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

相同的类型
© www.soinside.com 2019 - 2024. All rights reserved.