对结构的c代码引用

时间:2012-02-20 23:31:35

标签: c pass-by-reference

我是一个相当有经验的C ++程序员,但是(纯粹的!?)C代码我有时会挣扎,特别是当我暂时没有使用它时。有人可以给我一个暗示,为什么下面的代码不起作用?编译说:

syntax error : missing ')' before '&'

抱怨有printItem签名的行。我怎么能让它发挥作用?是将printItem签名更改为:

的唯一选项
void printItem(const struct structItem *const item)
{   
    printf("age: %i, price: %i", item->age, item->price);
}

或者是否有另一种方式,这将允许我保持签名,因为它在下面?另外,......我没有使用更方便的" typedef"结构的符号,因为我记得有些问题 - 可能在这种情况下。如果有人能说清楚这一切,我会非常感激。

#include <stdio.h>

struct structItem {
    int age;
    int price;
};

void printItem(const struct structItem &item)
{   
    printf("age: %i, price: %i", item.age, item.price);
}

int main()
{
    struct structItem item;
    item.age = 1;
    item.price = 200;

    printItem(item);

    getchar();

    return 0;
}

6 个答案:

答案 0 :(得分:4)

在C中,您必须通过指针传递,因此您可以像这样定义printItem

void printItem(struct structItem *item)
{
    printf("age: %i, price: %i", item->age, item->price);
}

要调用它,请指向它。 E.g:

printItem(&item);

答案 1 :(得分:2)

int main()
{
    struct structItem item;
    item.age = 1;
    item.price = 200;

    printItem(item);

此时,您将整个结构传递给printItem()函数。编译器(在语义上,如果不是实际)结构复制到您的函数的临时存储中。如果您想传递item结构的地址,请修改电话:

    printItem(&item);

你需要修改printItem()的原型,因为这不合法C:

void printItem(const struct structItem &item)

GCC抛出错误:

$ make item
cc     item.c   -o item
item.c:8:40: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token

将函数原型中的&更改为*,以声明该函数采用指向structItem 的指针,修改函数以使用{ {1}}通过指针访问结构成员,完整的程序是:

->

答案 2 :(得分:2)

引用是C ++语法。在纯C中,您只能在指针中使用按引用调用

void printItem(const struct structItem* const item) {
    printf("age: %i, price: %i", item->age, item->price);
}

小心使用函数调用。你需要用结构的地址来调用它。

struct structItem item;
item.age = 1;
item.price = 200;

printItem(&item);

答案 3 :(得分:1)

引用不是C语法的一部分,因此您必须将其更改为您在问题中提供的void printItem(const struct structItem *const item)签名,并相应地更改调用,即printItem(&item);

即使Jon Skeet这么说:Does C have references?

答案 4 :(得分:0)

如果结构很小,你也可以通过值传递:

void printItem(struct structItem item) {
    printf("age: %i, price: %i\n", item.age, item.price);
}

这个更快,因为不需要解除引用,并且通过值传递可以清楚地表明该项目不会被修改。

答案 5 :(得分:-1)

似乎导致构建中断的问题是

void printItem(const struct structItem *const item)

没有理由两次使用const关键字;事实上,这是非法的。即使标准合规性提高了,我仍然可以编译

#include <stdio.h>

struct structItem {
    int age;
    int price;
};

void printItem(const struct structItem *item) {
    printf("age: %i, price: %i\n", item->age, item->price);
}

int main(void) {
    struct structItem item;
    item.age = 10;
    item.price = 100;

    printItem(&item);
    return 0;
}

没问题,程序打印

age: 10, price: 100

正如所料。