江南侠客(上海)

江南侠客(上海)

目录

  1. 引言
  2. 结构体
    • 结构体类型声明方法
      • 有名字
      • 无名字
    • 结构体变量的声明方法
      • 初始化
      • 成员赋值
    • 成员调用方法
      • 取成员运算符
        • .
        • ->
    • 结构体大小
      • 内存对齐
  3. 链表
    • 单向链表
    • 双向链表
  4. C++独有特性
    • 声明变量可以不用struct关键字
    • 可以放函数成员
  5. 结论
  6. 参考资料

1. 引言

在C++语言中,结构体(struct)是一种用于组织数据的复合类型。它可以包含不同类型的成员变量和函数成员,并且可以通过成员运算符来访问和操作这些成员。本篇博客将详细介绍C++中结构体的各种特性,并提供具体的代码示例。

2. 结构体

2.1 结构体类型声明方法

在C++中,结构体可以通过有名字或无名字的方式进行类型声明。有名字的结构体可以在声明时定义成员变量和函数成员,而无名字的结构体通常用于定义匿名对象或作为其他结构体的成员。

有名字的结构体类型声明

struct Person 
{
    std::string name;
    int age;
};

无名字的结构体类型声明

struct 
{
    std::string name;
    int age;
} anonymousPerson;

2.2 结构体变量的声明方法

结构体变量可以通过初始化或成员赋值的方式进行声明。

初始化结构体变量

Person person = {"John", 25};

成员赋值

Person person;
person.name = "John";
person.age = 25;

2.3 成员调用方法

可以使用成员运算符.->来调用结构体的成员变量和成员函数。

使用.操作符

std::cout << person.name << std::endl;

使用->操作符

如果结构体变量是指针类型,则需要使用->操作符来访问成员。

Person* personPtr = &person;
std::cout << personPtr->name << std::endl;

2.4 结构体大小

结构体的大小由其成员变量的大小累加而成,但在内存中的存储可能会存在对齐的问题。

内存对齐

为了提高访问效率和内存对齐的要求,编译器通常会在结构体成员之间添加额外的填充字节,使得结构体在内存中的起始地址和每个成员变量的

地址都满足对齐要求。对齐方式和字节对齐的具体规则可能因编译器和平台而异。

3. 链表

链表是一种常见的数据结构,用于存储和组织具有相同类型的数据。在C++中,可以使用结构体来定义和操作链表。

单向链表

单向链表每个节点包含一个数据元素和一个指向下一个节点的指针。

struct Node 
{
    int data;
    Node* next;
};

双向链表

双向链表的节点除了包含数据元素和指向下一个节点的指针外,还包含一个指向前一个节点的指针。

struct Node 
{
    int data;
    Node* prev;
    Node* next;
};

4. C++独有特性

在C++中,结构体相比于C语言具有一些独有的特性。

声明变量可以不用struct关键字

在C++中,可以省略struct关键字直接声明结构体变量。

Person person;

可以放函数成员

C++的结构体中可以包含函数成员,这使得结构体更加灵活,可以封装数据和操作函数于一体。

struct Node 
{
    int data;
    void printData() 
    {
        std::cout << "Data: " << data << std::endl;
    }
};

可以通过结构体变量调用函数成员。

Node node;
node.printData();

5. 结论

本篇博客介绍了C++中结构体的各种特性和用法。通过结构体,我们可以灵活地组织数据和操作,实现复杂的数据结构和算法。同时,C++独有的特性使得结构体更加强大和灵活,为编程提供了更多的选择和便利。

6. 参考资料

07-05 03:44