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

时间:2016-11-06 05:09:01

标签: c function structure pass-by-reference

#include <stdio.h>

void changeValues(struct ITEM *item[]);

struct ITEM
{
int number;
};

int main(void)
{
    struct ITEM items[10];
    for (int i = 0; i < 10; i++)
    {
        items[i].number = i;//initialize
        printf("BEFORE:: %d\n", items[i].number);
    }

    changeValues(items);

    for (int i = 0; i < 10; i++)
    {
        items[i].number = i;
        printf("AFTER:: %d\n", items[i].number);
    }

    return 0;
}

void changeValues(struct ITEM *item[])
{
    for (int i = 0; i < 10; i++)
    item[i] -> number += 5;
}

我正在尝试将一组结构传递给一个函数。我需要通过引用而不是值来更改函数内的结构成员的值。由于某些奇怪的原因,当我在调用函数后打印结果时,值保持与函数调用之前的值相同。

2 个答案:

答案 0 :(得分:1)

在C中你不能通过引用传递(比如C ++)。您只能通过值传递,或通过指针传递。

在这种情况下,您似乎想要将一个struct数组传递给函数changeValues。这就是你在main中所做的。但是,changeValues的原型和实现实际上是在尝试将指针数组传递给struct ITEM

一种可能的解决方法是将指向struct ITEM的指针数组更改为struct数组。

void changeValues(struct ITEM item[])
{
    for (int i = 0; i < 10; i++)
    {
        item[i].number += 5;
    }
}
编辑:你的代码实际上还有两个错误:

1)struct ITEM的定义需要在changeValues原型之前:

struct ITEM
{
    int number;
};

void changeValues(struct ITEM item[]);

2)在你的main()中,你实际上重置了changeValues中的所有值 - 基本上你使该函数中的所有内容无效:

for (int i = 0; i < 10; i++)
{
    items[i].number = i;   // <-- Remove this line as you are resetting the value again here
    printf("AFTER:: %d\n", items[i].number);
}
struct ITEM
{
    int number;
};

void changeValues(struct ITEM item[]);


int main(void)
{
    struct ITEM items[10];
    for (int i = 0; i < 10; i++)
    {
        items[i].number = i;//initialize
        printf("BEFORE:: %d\n", items[i].number);
    }

    changeValues(items);

    for (int i = 0; i < 10; i++)
    {
        // items[i].number = i;   // <-- Remove this line as you are resetting the value again here
        printf("AFTER:: %d\n", items[i].number);
    }

    return 0;
}

void changeValues(struct ITEM items[])
{
    for (int i = 0; i < 10; i++)
    {
        items[i].number += 5;
    }
}

答案 1 :(得分:1)

您可以通过传递指针地址“传递参考”。

以下是一个例子:

int main(void)
{

    char *pA;     /* a pointer to type character */
    char *pB;     /* another pointer to type character */
    puts(strA);   /* show string A */
    pA = strA;    /* point pA at string A */
    puts(pA);     /* show what pA is pointing to */
    pB = strB;    /* point pB at string B */
    putchar('\n');       /* move down one line on the screen */
    while(*pA != '\0')   /* line A (see text) */
    {
        *pB++ = *pA++;   /* line B (see text) */
    }
    *pB = '\0';          /* line C (see text) */
    puts(strB);          /* show strB on screen */
    return 0;
}