You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++链表中struct与对象混用的原因及测试代码逻辑解析

C++循环链表代码解析与常见疑问解答

一、完整代码逻辑解析与输出结果

先看这段完整代码:

struct Element {
string name;
Element* next;
};      
Element *e1, *e2;
e1 = new Element ();
e2 = new Element ();    
e1->name = "I am e1 ";
e2->name = "I am e2 ";  
e1->next = e2;
e2->next = e1;  
e1=e2;  
cout << e1->name << e1->next->name;

逐行拆解执行过程:

  1. struct Element定义了一个链表节点类型,包含字符串成员name和指向同类型节点的指针next,用于构建链表结构。
  2. Element *e1, *e2;声明两个指向Element类型对象的指针,此时它们未初始化,属于野指针。
  3. e1 = new Element();和e2 = new Element();:在堆内存中分别创建两个独立的Element对象,将对象的内存地址分别赋值给e1和e2,此时e1、e2各自指向一个节点对象。
  4. e1->name = "I am e1 ";和e2->name = "I am e2 ";:为两个节点的name成员赋值。
  5. e1->next = e2;和e2->next = e1;:让两个节点的next指针互相指向对方,形成循环链表结构。
  6. e1 = e2;:将e2的地址赋值给e1,此时e1和e2指向同一个节点(原e2指向的、name为"I am e2 "的节点)。
  7. cout << e1->name << e1->next->name;:e1->name取当前指向节点的name值,即"I am e2 ";e1->next指向原e1节点(循环链表的关联关系未改变),所以e1->next->name是"I am e1 "。最终输出结果为:I am e2 I am e1

二、关于“混用struct与对象”的疑问

在C++中,struct定义的是类类型(和class几乎等价,仅默认成员权限不同:struct默认public,class默认private)。这段代码不存在“混用”问题:

  • struct Element是定义节点的类型模板;
  • new Element()基于该类型创建具体的堆对象;
  • e1、e2是指向这些对象的指针,用于操作对象。
    这是C++用结构体构建链表的标准写法,完全合理。

三、指针声明与对象创建代码解析

针对这段代码:

Element *e1, *e2;
e1 = new Element ();
e2 = new Element ();
  • Element *e1, *e2;:声明两个Element*类型的指针变量,此时它们未绑定有效内存,属于野指针,直接解引用会触发未定义行为。
  • e1 = new Element();:调用Element的默认构造函数,在堆内存中分配符合Element类型大小的空间并创建对象,将对象地址赋值给e1,此时e1指向该堆对象。同理e2 = new Element();创建第二个独立的Element对象并让e2指向它。

内容的提问来源于stack exchange,提问作者Ponghines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:25:25