如何通过C中的引用将结构的成员传递给函数?

时间:2017-11-09 09:28:50

标签: c struct

我试图通过引用将stuct的成员传递给c中的函数,然后使用它来访问相同类型的struct的相同成员。

typedef struct Node
{
int a;
int b;
int c;
} Node;

Node mynode; //global

void pass_member(int *member){
   mynode.&member = 1;//gives a compiler error
}

void main()
{
 mynode.a = 0;
 mynode.b = 45;
 mynode.c = 64;

 pass_member(&mynode.a)
}

我可以看到c中不允许mynode.&member,但我认为它显示了我想要做的事情

是否可以将结构成员的地址传递给c中的函数,然后用它来访问相同类型结构中的该成员?

基本上我想要实现的是一个像这样的功能
void set_member(int value_to_set, int * pointer_to_member_of_which_to_set);

这将根据函数的给定成员设置全局结构的特定成员。

3 个答案:

答案 0 :(得分:1)

我先给你举一些例子: -

你可以这样做func(&mynode)

funcvoid func(Node* aa)

现在你可以像这样使用它了

aa->a = aa->a + 1等。

大多数情况下,您将发送整个结构的地址而不是单个元素的地址。

  • Node aa => aa是struct node类型(typedefed to Node)

  • 地址:&aa

  • aa.a是结构aa的元素,其地址为&aa.a

解决方案-1

void pass_member(int *member){
   *member = 1;
}
  pass_member(&mynode.a) // in main()

解决方案-2

你也可以像这样使用它: -

typedef struct Node
{
int a;
int b;
int c;
} Node;

Node mynode; //global

void pass_member(Node *member){
   (*member).a = 1;//member->a = 1
}

void main()
{
 mynode.a = 0;
 mynode.b = 45;
 mynode.c = 64;

 pass_member(&mynode)
}

您问是否可以将结构成员的地址传递给c中的函数?

答:是的,这是可能的,它会在答案中显示。

然后使用它来访问相同类型的结构中的该成员?

您可以访问某些结构或其他结构的memebr。只要它是指向适当类型的指针就可以。

答案 1 :(得分:0)

您有两个选项,要么将指向成员变量的指针传递为

void pass_member(int *member){
  *member = 1;

 pass_member(&mynode.a);

或者将指针传递给整个结构

void pass_member(Node *member){
  (*member).a = 1; //or member->a = 1; as pointed out in comments

pass_member(&mynode)

答案 2 :(得分:0)

您可以使用offsetof获取成员的相对地址。我不知道反向操作(在C中做不了多少),但它可以像这样模拟:

#define offsetin(s,a,t) *((t*)(((char*)&s)+a))

然后你的代码看起来像这样:

void pass_member(size_t member){
    offsetin(mynode, member, int) = 1;
}

void main()
{
    mynode.a = 0;
    mynode.b = 45;
    mynode.c = 64;

    pass_member(offsetof(Node,a));
}