C 如何将结构数组从一个函数传递到另一个函数?
可能重复:C 如何将结构数组从一个函数传递到另一个函数?,c,C,可能重复: 将一个结构数组从一个函数传递到另一个函数的最佳方法是什么 假设我有 funcion1(){ struct album_ { int num_tracks; struct tracks_ tracks; int playlist_hits[]; }; typedef struct album_ album; album all_album[50]; } function2(){ } 我如何通过all_相册[50]到函数2()?无效myFu
将一个结构数组从一个函数传递到另一个函数的最佳方法是什么 假设我有
funcion1(){
struct album_ {
int num_tracks;
struct tracks_ tracks;
int playlist_hits[];
};
typedef struct album_ album;
album all_album[50];
}
function2(){
}
我如何通过all_相册[50]代码>到函数2()?无效myFunc(相册*A,int N)
{
int i;
对于(i=0;i
结构类似于任何其他类型。可以像传递整数数组一样传递它。如果将(如上所述)声明为全局,则根本不需要将其作为固定大小的数组或指针和大小对进行传递
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);
}
要将任何类型为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
或一元&
运算符的操作数,或者是用于初始化声明中另一个数组的字符串文字,否则“T
的N元素数组”类型的表达式将替换为“指向T
的指针”类型的表达式其值是数组第一个元素的地址
瞧,当你写作的时候
foo(all_album, sizeof all_album / sizeof *all_album);
发生了几件事
all_-album
表达式替换为一个指针表达式,其值为&all_-album[0]
;这就是为什么foo
定义中的a
类型具有类型album*
all\u album
是sizeof
运算符的操作数,因此不会将其转换为指针表达式sizeof*all_album
表达式计算为album
类型的单个对象中的字节数。由于all\u album
不是sizeof
的操作数(表达式*all\u album
是操作数),因此首先将其转换为“指向album
的指针”类型的表达式。将*
操作数应用于该指针表达式,生成类型为album
的新表达式,该表达式由sizeof
计算sizeof all_album/sizeof*all_album
,得到数组中的元素数。此值作为foo
定义中的size
参数传递但是它是在另一个函数中创建的。与调用
myFunc()
中的50
不同,您可以使用sizeof MyAlbums/sizeof*MyAlbums
并避免再次使用神奇常数:)pmg是正确的,但仅适用于堆栈上的数组。sizeof()不应应用于malloc'd或new'd数组。foo
没有做您认为它正在做的事情。在函数参数声明的上下文中,ta[N]
和ta[]
与ta*a
相同;在函数foo
中,all\u album
是指针,而不是数组。
foo(all_album, sizeof all_album / sizeof *all_album);