You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将结构体指针数组完整传入函数?参数语法咨询

解决结构体指针数组传入函数的参数问题

嘿,我来帮你理清这个困惑!你定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:59:41