【问题标题】:How to pass a member of a struct to a function by reference in C?如何通过C中的引用将结构的成员传递给函数?
【发布时间】:2017-11-09 09:28:50
【问题描述】:

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

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)
}

我可以看到 mynode.&member 在 c 中是不允许的,但我认为它显示了我正在尝试做的事情

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

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

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

【问题讨论】:

  • mynode.&member = 1; --> *member = 1;
  • “我想要实现的是一个函数......它会根据给定的函数成员设置全局结构的特定成员”这是问题的根源。不要写这么傻的函数,这样的程序设计不好。特别是,使用与函数和调用者共享的全局变量是非常糟糕的。相反,只需在调用者中写入:mynode.a = whatever;
  • 基本上,这里只有两个有效的程序设计案例。调用者知道结构的性质,然后调用者可以更改它。或者调用者不知道结构的性质 - 因为结构是私有封装的 - 在这种情况下,结构的成员与调用者无关。
  • 点赞this

标签: c struct


【解决方案1】:

我先给你举个例子:-

你可以这样做func(&mynode)

funcvoid func(Node* aa)

现在可以这样使用了

aa->a = aa->a + 1

大多数时候你会发送整个结构的地址而不是单个元素的地址。

  • Node aa => aa 是结构节点类型(类型定义为节点)

  • 地址:&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 中的函数?

Ans:是的,这是可能的,答案中已显示。

然后用它来访问同类型结构中的那个成员?

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

【讨论】:

    【解决方案2】:

    你有两个选择,要么将指针传递给成员变量

    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)
    

    【讨论】:

    • (*member).a = 1; 可以简单地写成member->a = 1;
    【解决方案3】:

    您可以使用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));
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2021-03-03
      • 2018-09-22
      相关资源
      最近更新 更多