我有一个结构需要用于两个不同的变量(firstVar和secondVar)。 我不想使用vectors,而只使用2个简单结构。 由于我不想复制需要用户输入的代码,因此我想创建一个同时调用(firstVar和secondVar)的动作
我希望能够通过引用将结构传递给操作。 这是我的代码,我仍然不知道自己在做什么错。
#include <stdio.h>
typedef struct {
int id;
float length;
} tMystruct;
tMystruct firstVar;
tMystruct secondVar;
void readStructs(tMystruct *theVar)
{
scanf("%d",theVar.id);
scanf("%f",theVar.length);
}
int main(void)
{
readStructs(&firstVar);
readStructs(&secondVar);
return 0;
}
答案 0 :(得分:1)
您可以将它们作为参考传递。
正如已经指出的那样,所有传入C都是按值进行的;被调用函数总是收到您传入的内容的副本。为了访问函数外部的实际值,您需要它的地址+类型信息,这在C语言中是通过传递指针来实现的。鉴于此,除了scanf调用外,您的代码没有任何错误,并且您实现了日常英语所表达的内容:
我希望能够通过引用将结构传递给操作。
现在回答您实际提出的问题:
不能在仅具有指针的结构上使用点符号。另外,scanf想要将要写入的变量的地址。
void readStructs(tMystruct *theVar)
{
scanf("%d",&theVar->id);
scanf("%f",&theVar->length);
}
答案 1 :(得分:1)
这是问题所在,
void readStructs(tMystruct *theVar)
{
scanf("%d",theVar.id); //<------problem
scanf("%f",theVar.length); //<------problem
}
您应该使用->
运算符访问Structure指针成员,并且您丢失了&
,这最终会导致分段错误。
这是修改后的代码,
void readStructs(tMystruct *theVar)
{
scanf("%d",&theVar->id);
scanf("%f",&theVar->length);
}
答案 2 :(得分:1)
请记住,在C语言中,确实没有通过引用传递,您通常按值传递。这是微妙但重要的区别。考虑一下:
void func_a(int *a) {
a = 0;
}
int main() {
int value = 5;
func_a(&value);
return 0;
}
我们在这里看到我们设置了a = 0;
,但这对实际值没有影响,您只是更改为它在本地函数作用域中指向的位置。如果我们想实际更改a
的值,则必须取消引用。
*a = 0;
在诸如C ++和C#之类的语言中,有一些语言构造可以通过引用传递,但是在C语言中,您只能按值传递。
对于您的代码,一个简单的解决方法是:
void readStructs(tMystruct *theVar)
{
scanf("%d", &theVar->id);
scanf("%f", &theVar->length);
}
您的函数接受指向tMystruct
的指针作为它的第一个参数,因此我们可以使用箭头运算符->
来访问该值,然后获取其地址并将其传递给scanf
。等同于
void readStructs(tMystruct *theVar)
{
scanf("%d", &((*theVar).id));
scanf("%f", &((*theVar).length));
}