如何通过C中的引用将结构数组传递给函数?

时间:2017-04-10 09:40:31

标签: c arrays function pointers struct

此代码与我尝试的内容类似,但是我收到的错误是说我传递了不兼容的类型

 #include <stdio.h>

struct numbers{
    int num;
};

void fillArray(struct numbers* a[]);

int main(void)
{
    struct numbers array[4]; 

    fillArray(&array);

    for(int i = 0; i < 4; i++)
    {
        printf("%d", array[i].num);
    }

}

void fillArray(struct numbers* a[])
{
    for(int i = 0; i < 4; i++)
    {
        a[i]->num = i;
    }
}

4 个答案:

答案 0 :(得分:2)

功能参数

void fillArray(struct numbers* a[]);

调整为

void fillArray(struct numbers ** a);

另一方面,此调用中的参数类型

fillArray(&array);

struct numbers( * )[4]struct numbers **struct numbers ( * )[4]类型不兼容。

没有必要传递指向数组的指针,因为如果只传递隐式转换为指向第一个元素的指针的数组,则数组的元素已经间接传递。

所以你需要的是声明和定义像

这样的函数
void fillArray( struct numbers a[] )
// or
// void fillArray( struct numbers *a )
{
    for(int i = 0; i < 4; i++)
    {
        a[i].num = i;
    }
}

并将其称为

fillArray( array );

考虑到函数取决于幻数4.最好定义函数,以便它可以处理各种元素的数组。

所以我会定义像

这样的函数
void fillArray( struct numbers a[], size_t n )
// or
// void fillArray( struct numbers *a, size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        a[i].num = i;
    }
}

并将其称为

fillArray( array, 4 );

这里演示了程序如何整体看待

#include <stdio.h>

struct numbers
{
    int num;
};

void fillArray( struct numbers a[], size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        a[i].num = i;
    }
}

#define N   4

int main(void) 
{
    struct numbers array[N]; 

    fillArray( array, N );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", array[i].num );
    }

    putchar( '\n' );

    return 0;
}

它的输出是

0 1 2 3 

要使用具有不同数量元素的数组,只需更改宏名称N的值即可。因此,程序及其功能不依赖于幻数4

答案 1 :(得分:1)

你的函数想要一个指针数组,但你有一个数组,所以

void fillArray(struct numbers* a);

void fillArray(struct numbers a[]);

此外,使用[i]您已取消引用指针,因此您需要.而不是->运算符。

#include <stdio.h>

struct numbers
{
    int num;
};

void fillArray(struct numbers *a);

int main(void)
{
    struct numbers array[4];

    fillArray(array);

    for (int i = 0; i < 4; i++)
    {
        printf("%d", array[i].num);
    }

    printf("\n");

}

void fillArray(struct numbers *a)
{
    for (int i = 0; i < 4; i++)
    {
        a[i].num = i;
    }
}

最后使用 array decays to pointer到数组的第一项,所以

fillArray(&array);

必须是

fillArray(array);

fillArray(&array[0]);

最后,您应该将数组大小传递给您的函数,而不是使用固定数字。你可以使用指针和大小

来做到这一点
#include <stdio.h>

struct numbers
{
    int num;
};

void fillArray(size_t size, struct numbers *a);

int main(void)
{
    struct numbers array[4];

    fillArray(sizeof(array)/sizeof(array[0]), array);

    for (int i = 0; i < 4; i++)
    {
        printf("%d", array[i].num);
    }

    printf("\n");

}

void fillArray(size_t size, struct numbers *a)
{
    for (size_t i = 0; i < size; i++)
    {
        a[i].num = i;
    }
}

或使用VLA s

#include <stdio.h>

struct numbers
{
    int num;
};

void fillArray(size_t size, struct numbers a[size]);

int main(void)
{
    struct numbers array[4];

    fillArray(sizeof(array)/sizeof(array[0]), array);

    for (int i = 0; i < 4; i++)
    {
        printf("%d", array[i].num);
    }

    printf("\n");

}

void fillArray(size_t size, struct numbers a[size])
{
    for (size_t i = 0; i < size; i++)
    {
        a[i].num = i;
    }
}

答案 2 :(得分:1)

你可能想要这个:

#include <stdio.h>

struct numbers {
    int num;
};

void fillArray(struct numbers a[]);

int main(void)
{
    struct numbers array[4];

    fillArray(array);

    for (int i = 0; i < 4; i++)
    {
        printf("%d\n", array[i].num);
    }

}

void fillArray(struct numbers a[])
{
    for (int i = 0; i < 4; i++)
    {
        a[i].num = i;
    }
}

答案 3 :(得分:-1)

仅提及数组名称就足够了。编译器会将其转换为指向第一个元素的指针。

所以而不是

 fillArray(&array);
你写了

 fillArray(array);

虽然这回答了你的问题,但当然被调用的函数必须有一个兼容的定义,在你的情况下不是这样。