如何将结构数组从一个函数传递到另一个函数?

时间:2012-03-30 20:43:49

标签: c

  

可能重复:
  passing array of structure as a function parameter

将一个结构数组从一个函数传递到另一个函数的最佳方法是什么?

让我说我有

funcion1(){
   struct album_ {
   int num_tracks;
   struct tracks_ tracks;
   int playlist_hits[];
   };
   typedef struct album_ album;
   album all_album[50];
}

function2(){
}

我如何将all_album[50];传递给function2()?

4 个答案:

答案 0 :(得分:2)

struct就像任何其他类型一样。您可以像传递整数数组一样传递它。如果您将(如上所述)声明为全局,则根本不需要传递。

答案 1 :(得分:1)

void myFunc( album* A, int N )
{
   int i;
   for( i = 0; i < N; i++ )
      A[i].num_tracks = 0;
}

void main()
{
   album MyAlbums[50];
   myFunc( MyAlbums, 50 );
}

答案 2 :(得分:0)

既可以是固定大小的数组,也可以是指针和大小对。

struct tracks_ {
};

struct album_ {
  int num_tracks;
  struct tracks_ tracks;
  int playlist_hits[];
};
typedef struct album_ album;
album all_album[50];

void foo(album all_album[50]) {
 //passes this way
}

void foo2(album* all_album, size_t size) { //or degrades to a pointer
}

int main() {
   foo(all_album);
   foo2(all_album, 50);
}

答案 3 :(得分:0)

为了将任何类型T的数组传递给函数,通常编写一个函数来接受指向T的指针和一个单独的大小参数:

void foo(album *a, size_t size) { ... }

传递数组表达式和大小:

int main(void)
{
  ...
  album all_album [N];
  ...
  foo(all_album , sizeof all_album / sizeof *all_album )
  ...
}

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of T“将替换为”T指针“类型的表达式,其值是数组第一个元素的地址。

IOW,当你写作

foo(all_album, sizeof all_album / sizeof *all_album);
发生了好几件事。

  1. 第一个all_album表达式替换为值为&all_album[0]的指针表达式;这就是a定义中foo的类型具有类型album *的原因。

  2. sizeof all_album表达式的计算结果为数组中的总字节数。由于all_albumsizeof运算符的操作数,因此转换为指针表达式。

  3. sizeof *all_album表达式计算类型为album对象中的字节数。由于all_album 不是 sizeof的操作数(表达式 *all_album是操作数),因此首先将其转换为表达式类型为“album的指针”。 *操作数应用于该指针表达式,产生类型为album的新表达式,由sizeof计算。

  4. 评估
  5. sizeof all_album / sizeof *all_album,得出数组中元素的数量。此值是作为size定义中的foo参数传递的值。