【问题标题】:Accessing address of members of a struct variable using pointer to that structure使用指向该结构的指针访问结构变量成员的地址
【发布时间】:2017-05-12 15:11:44
【问题描述】:
#include<iostream>
    using namespace std;
    int main()
    {
    struct node
    {
        int data;
        struct node *next;
    };

    struct node *node1;

    struct node node2;

    node2.data = 200;
    node2.next = NULL;

    cout<<"address of node2: "<<&node2<<endl;

    cout<<"address of node2.data: "<<&node2.data<<endl;

    cout<<"address of node2.next: "<<&node2.next<<endl;

    cout<<"value of node2 data: "<<node2.data<<endl;

    cout<<"value of node2 next is: "<<node2.next<<endl;

    node1 = (struct node*)malloc(sizeof(node));

    node1->data = 100;

    node1->next = NULL;

    cout<<"value of node1 data: "<<node1->data<<endl;

    cout<<"value of node1 next: "<<node1->next<<endl;

    cout<<"address of node1 variable is: "<<&node1<<endl;

    cout<<"address of node1 data variable is: "<<&node1->data<<endl;

    cout<<"address of node1 next variable is: "<<&node1->next<<endl;

    cout<<"value stored at node1 variable is: "<<node1<<endl;

    }

我想使用指向该结构的指针打印结构变量成员的地址。从上面的代码示例中可以看出,我使用了 &node1->next 和 &node1->data 来打印地址。它似乎打印了正确的地址,因为我可以通过取消引用 &node1->next 和 &node1->data 返回的地址来访问这些值。 *(&node1->next) 和 *(&node1->data) 正确返回值。

但我不明白符号“&node1-> data”和“&node1->next”如何返回结构变量成员的地址。我偶然发现 &node1->data 和 &node1->next 打印了地址。而使用 &node2.data 和 &node2.next 等其他符号时,我能够在逻辑上提出这些符号来打印地址,但是在使用指向结构的指针来打印地址时,我意外地发现了它们,而不是能够在逻辑上来加上正确的符号。

我想知道我想出的是否是打印成员变量地址的正确用法,如果是,它是如何正确表示的?

【问题讨论】:

  • @tobi303 问题是如何使用指向该结构的指针打印结构变量成员的地址?你会使用 &pointer_var->data_member 吗?如果是的话,这实际上是如何返回数据的?在使用它访问地址的上下文中可视化这个符号是令人困惑的
  • 你为什么在 C++ 中使用malloc
  • 我想我已经找到了答案,但我仍然想听听有经验的 C/C++ 开发人员的意见。我们使用符号 (*node1).next 或 node1->next 来访问(或打印)结构中下一个变量的值。为了打印地址,我们只需将 & 符号附加到 &(node1->next) 或 &((*node1).next)。使用括号更容易理解。
  • @tobi303 非常感谢!这是一个正确的解释。我犯的错误是我试图通过将其与指向整数变量的普通指针进行比较来理解指向 struct 的指针。如果我们有一个指向整数变量的指针,那么要打印该整数变量地址,我们只需打印指针中的值 (cout
  • 其实,这不是一个很好的解释。我将删除 cmets 并让您参考同时给出的答案

标签: c++ pointers struct


【解决方案1】:

我想知道我想出的是否是打印成员变量地址的正确用法,如果是,它是如何正确表示的?

是的,没错。

间接运算符或“箭头”-&gt; 返回指向对象成员的引用。因此,操作员地址&amp; 的参数是成员。 adderess-of 返回该对象的地址,即成员的地址。因此,从逻辑上来说,获取成员地址的正确方法是先用箭头操作符来获取对象,然后再用操作符的地址,如下所示:

auto* pointer_to_object = get_the_object();
auto* address_of_member = &pointer_to_object->name_of_member;

它似乎打印了正确的地址,因为我可以通过取消引用 &amp;node1-&gt;next&amp;node1-&gt;data 返回的地址来访问这些值。 *(&amp;node1-&gt;next)*(&amp;node1-&gt;data) 正确返回值。

这应该很明显。取消引用操作是地址操作的逆操作,因此按顺序应用这两个操作将相互抵消。 *&amp;node1-&gt;data 等价于node1-&gt;data,确实返回了成员的值。

【讨论】:

  • 感谢您的回答。 1.“箭头”->返回对指向对象成员的引用”,所以在我的示例中,成员将是“数据”变量,对象将是“node1”(指向结构的指针)?2。如果箭头返回仅引用数据成员,那么我们如何使用 node1->data 打印存储在数据中的值?(如果这是一个不好的问题,请多多包涵)
  • @livetolearn 1. 我所说的对象是*node1,即node1 指向的对象。 2. 因为这就是引用的工作方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2023-03-12
  • 2015-01-24
相关资源
最近更新 更多