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