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

时间:2018-05-04 05:57:03

标签: c pointers

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int lab;
    int arr[20];
    int vac;
}bookings;

void checkIn(bookings *in)
{
    printf("It is %i",in[0].arr[0]);
}

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;
            b[a].vac=20;
            /*printf("Lab %i PC %i is %i\n",a,c,b[a].arr[c]);*/
        }
        /*printf("Lab %i has vacant %i\n",a,b[a].vac);*/
    }
    b[0].lab=101;
    b[1].lab=201;
    b[2].lab=301;
    b[3].lab=401;
    b[4].lab=501;
    checkIn(&b);

    return 0;
}

根据代码,我在arr [20]数组中赋值为0,在每个结构中,vac值为20.我想要做的就是传递数组结构进入函数并读取函数中的值。根据我到目前为止所读到的内容,使用函数参数中的指针并传递struct address数组应该可以正常工作。

编译时,它会显示错误,错误从不兼容的指针类型&#39;传递checkIn的argument1。 我的预期输出是

It is 0

任何帮助都会非常感激!

3 个答案:

答案 0 :(得分:4)

表达式&b提供b 数组的地址,而不是第一个元素。它们位于内存中的相同位置,但类型不同。 &b的类型为bookings (*)[5];也就是说,指向一个包含五个bookings es的数组的指针。您的函数只需要bookings*(指向单个bookings的指针或未知数量的数组的开头)。你可以通过跳过&并只是传递b,或者通过查看&(b[0])来获取第一个地址的数组到指针衰减数组的元素。

答案 1 :(得分:3)

您需要在没有& - checkIn(b);

的情况下传递数组

如果有&,则数组不会转换为指向第一个元素的指针,类型为bookings (*)[5]。函数需要bookings*,并且会收到警告。

如果没有&,则数组会衰减到指针并且预期的类型是正确的。

答案 2 :(得分:2)

应该是:

checkIn(b);

&b会返回bookings(*)[5]的类型。如果你需要修改你的数组(不是它的元素,它们已经通过引用传递)会很有用。