C++ 指向结构体的指针

C++ 指向结构体的指针

C++ 指向结构体的指针

在 C++ 中,结构体是一种用户自定义的数据类型,可以将不同种类的数据组合到一个结构体中,便于管理和操作。而指针是一种特殊的变量,它存储的是内存地址,可以通过指针来访问和修改内存中的数据。将指针与结构体结合使用,可以实现对结构体的灵活操作。本文将详细介绍 C++ 中指向结构体的指针的使用。

1. 定义结构体

在开始讲解指向结构体的指针之前,我们先来了解一下如何定义并使用结构体。

结构体的定义使用 struct 关键字,后接结构体的名称和花括号内的成员变量。下面是一个简单的示例:

#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    Person p1;
    p1.name = "Alice";
    p1.age = 20;

    cout << "Name: " << p1.name << endl;
    cout << "Age: " << p1.age << endl;

    return 0;
}

运行上述代码,输出如下:

Name: Alice
Age: 20

在上述示例中,我们定义了一个名为 Person 的结构体,它有两个成员变量 nameage。然后在 main 函数中,创建了一个 Person 类型的变量 p1,并通过 . 操作符访问和修改了结构体的成员变量。

2. 指向结构体的指针

指向结构体的指针是指针变量,它存储的是结构体的地址。通过指针可以方便地操作结构体,例如访问和修改结构体的成员变量。

为了定义指向结构体的指针,需要在指针类型前加上 struct 关键字和结构体的名称。下面是一个示例:

#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    Person p1;
    p1.name = "Alice";
    p1.age = 20;

    Person* ptr;
    ptr = &p1;

    cout << "Name: " << ptr->name << endl;
    cout << "Age: " << ptr->age << endl;

    return 0;
}

运行上述代码,输出与之前相同:

Name: Alice
Age: 20

在上述示例中,我们首先定义了一个名为 ptr 的指向 Person 结构体的指针。然后,将 p1 的地址赋值给指针变量 ptr,即 ptr = &p1;。接下来,我们使用 -> 操作符通过指针来访问和修改结构体的成员变量。

3. 动态分配结构体内存

在 C++ 中,可以使用 new 运算符动态分配内存来创建结构体的实例。动态分配的结构体实例会在堆上分配内存,可以通过指针来访问和操作。

下面是一个示例代码:

#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    Person* ptr = new Person;  // 动态分配内存
    ptr->name = "Bob";
    ptr->age = 25;

    cout << "Name: " << ptr->name << endl;
    cout << "Age: " << ptr->age << endl;

    delete ptr;  // 释放内存

    return 0;
}

运行上述代码,输出如下:

Name: Bob
Age: 25

在上述示例中,我们使用 new 运算符动态分配了一个 Person 结构体的实例,并将其地址赋值给指针变量 ptr。然后,通过指针变量 ptr 来访问和修改结构体的成员变量。最后,使用 delete 运算符释放动态分配的内存。

4. 指向结构体的指针数组

在实际应用中,可能会需要存储多个结构体实例,并使用指针数组来管理这些实例。指针数组是指数组中的每个元素都是指针。通过指针数组,可以方便地对多个结构体实例进行操作。

下面是一个示例代码:

#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    const int size = 3;
    Person* ptrArr[size];  // 指针数组

    for (int i = 0; i < size; i++) {
        ptrArr[i] = new Person;  // 动态分配内存
        ptrArr[i]->name = "Person " + to_string(i);
        ptrArr[i]->age = 20 + i;

        cout << "Name: " << ptrArr[i]->name << ", Age: " << ptrArr[i]->age << endl;
    }

    for (int i = 0; i < size; i++) {
        delete ptrArr[i];  // 释放内存
    }

    return 0;
}

运行上述代码,输出如下:

Name: Person 0, Age: 20
Name: Person 1, Age: 21
Name: Person 2, Age: 22

在上述示例中,我们首先定义了一个大小为 size 的指针数组 ptrArr,其中每个元素都是 Person 结构体的指针。然后,使用循环动态分配了 sizePerson 结构体实例,并通过指针数组来访问和修改每个实例的成员变量。最后,使用循环来释放动态分配的内存。

5. 结构体指针作为函数参数

结构体指针还可以作为函数的参数传递,从而可以在函数内部对结构体进行修改。通过传递指针而不是结构体的副本,可以提高程序的性能和效率。

下面是一个示例代码:

#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

void updatePerson(Person* ptr) {
    ptr->name = "Charlie";
    ptr->age = 30;
}

int main() {
    Person p1;
    p1.name = "Alice";
    p1.age = 20;

    cout << "Before update: ";
    cout << "Name: " << p1.name << ", Age: " << p1.age << endl;

    // 将结构体指针作为参数传递给函数
    updatePerson(&p1);

    cout << "After update: ";
    cout << "Name: " << p1.name << ", Age: " << p1.age << endl;

    return 0;
}

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程