将一个结构数组从一个函数传递到另一个函数的最佳方法是什么?
让我说我有
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()?
答案 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);
发生了好几件事。
第一个all_album
表达式替换为值为&all_album[0]
的指针表达式;这就是a
定义中foo
的类型具有类型album *
的原因。
sizeof all_album
表达式的计算结果为数组中的总字节数。由于all_album
是sizeof
运算符的操作数,因此不转换为指针表达式。
sizeof *all_album
表达式计算类型为album
的单对象中的字节数。由于all_album
不是 sizeof
的操作数(表达式 *all_album
是操作数),因此首先将其转换为表达式类型为“album
的指针”。 *
操作数应用于该指针表达式,产生类型为album
的新表达式,由sizeof
计算。
sizeof all_album / sizeof *all_album
,得出数组中元素的数量。此值是作为size
定义中的foo
参数传递的值。