如何在C中通过引用传递结构?

时间:2018-11-01 08:05:21

标签: c struct

我有一个结构需要用于两个不同的变量(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;
}

3 个答案:

答案 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));
}