如何将结构体指针数组完整传入函数?参数语法咨询
解决结构体指针数组传入函数的参数问题
嘿,我来帮你理清这个困惑!你定义的struct Book *BookList[10]是一个包含10个指向struct Book的指针的数组,要把它传入ListBooks函数,有两种等价且正确的参数写法,我给你详细拆解:
合法的参数写法
写法1:数组形式(直观易懂)
函数参数可以写成数组的形式,编译器会自动把它转换成指向数组第一个元素的指针:
void ListBooks(struct Book *BookList[], int size)
这里的struct Book *BookList[]和struct Book **BookList是完全等价的——因为函数参数中的数组声明本质上会被解析为指针类型。
写法2:指针形式(更明确底层逻辑)
如果你想直接体现数组退化为指针的特性,也可以写成:
void ListBooks(struct Book **BookList, int size)
两种写法在编译器看来没有区别,选哪个全看你觉得哪种更清晰。
为什么需要size参数?
当数组传入函数后,它会丢失自身的长度信息——你没法在函数内部用sizeof(BookList)/sizeof(BookList[0])来获取数组元素个数,所以必须手动传入数组的总长度(比如你的例子里是10),这样才能安全地遍历所有元素。
函数内部访问元素的示例
拿到参数后,你可以直接用BookList[i]访问数组的第i个元素(它是一个struct Book*指针),然后用->运算符访问结构体成员:
#include <stdio.h> struct Book{ char Category[20]; int ID; char BookName[40]; char Author[10]; }; void ListBooks(struct Book **BookList, int size) { for (int i = 0; i < size; i++) { // 先检查指针是否有效,避免空指针访问(如果数组里有未初始化的元素) if (BookList[i] != NULL) { printf("第%d本书:\n", i); printf(" 分类:%s\n", BookList[i]->Category); printf(" ID:%d\n", BookList[i]->ID); printf(" 书名:%s\n", BookList[i]->BookName); printf(" 作者:%s\n\n", BookList[i]->Author); } } } int main() { // 先定义几本实体书 struct Book book1 = {"小说", 1001, "《了不起的盖茨比》", "菲茨杰拉德"}; struct Book book2 = {"科普", 1002, "《时间简史》", "霍金"}; // 初始化指针数组,前两个元素指向实体书,其余默认是NULL struct Book *BookList[10] = {&book1, &book2}; // 调用函数,传入数组和总长度 ListBooks(BookList, 10); return 0; }
这段代码运行后会输出前两本书的信息,后面的NULL元素会被跳过,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

