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

如何使用指针将结构体数组传递给函数?

如何用指针将结构体数组传递给函数

没问题,我来帮你搞定这个问题。首先得明确:结构体数组的名字本身就是指向数组第一个元素的指针,所以传递起来非常直接,咱们结合你的代码一步步说。

核心原理

当你定义bookings b[5];时,变量b本质上是一个bookings *类型的指针,指向数组的第一个结构体元素b[0]。所以你只需要把这个指针传给checkIn函数就行——不管是直接传数组名,还是取第一个元素的地址,效果完全等价。

修正你的代码

先把你未完成的checkIn调用补全,同时优化一下初始化逻辑(原来的vac赋值放在内层循环里会重复20次,没必要):

#include <stdio.h>
#include <stdlib.h>
typedef struct{
    int lab;
    int arr[20];
    int vac;
}bookings;

void checkIn(bookings *in) {
    // 访问数组第一个结构体的lab和arr[0]
    printf("Lab %d's first PC status: %i\n", in[0].lab, in[0].arr[0]);
    // 也可以直接访问数组里的其他元素,比如第二个实验室的编号
    printf("Second lab number: %d\n", in[1].lab);
}

int main(){
    bookings b[5];
    int a,c;
    /*Initializing struct variables*/
    for(a=0;a<5;a++) {
        for(c=0;c<20;c++) {
            b[a].arr[c]=0;
        }
        // 把vac的初始化移到内层循环外,避免重复赋值
        b[a].vac=20;
    }
    b[0].lab=101;
    b[1].lab=201;
    b[2].lab=301;
    b[3].lab=401;
    b[4].lab=501;
    
    // 方式1:直接传递数组名(推荐,写法更简洁直观)
    checkIn(b);
    // 方式2:传递第一个元素的地址,和上面完全等价
    // checkIn(&b[0]);
    
    return 0;
}

进阶:传递数组长度(避免越界)

如果你的函数需要遍历整个结构体数组,最好额外传递一个数组长度参数,不然函数没法知道数组有多少个元素,容易出现越界访问。比如修改checkIn函数:

void checkIn(bookings *in, int arrLength) {
    for(int i=0; i<arrLength; i++){
        printf("Lab %d has %d vacant PCs\n", in[i].lab, in[i].vac);
    }
}

调用的时候就传数组的长度:

checkIn(b, 5);

额外说明

因为传递的是指针,所以在checkIn函数里对结构体成员的修改会直接影响到原数组的元素。比如你在函数里写in[0].vac = 19;,那么main里的b[0].vac也会变成19——这是指针传递的特性,不用额外做什么。

内容的提问来源于stack exchange,提问作者digdigdoot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:22