Работа с указателями на структуры в C++ имеет свои особенности. Указатели на структуры позволяют работать с объектами структур через их адреса, что может быть полезно для динамического выделения памяти, передачи больших структур в функции без копирования и других задач.

Создание и использование указателей на структуры

  1. Объявление указателя:

    Person *p;
  2. Присваивание адреса существующего объекта:

    Person person;
    p = &person;
  3. Доступ к членам структуры через указатель: Используйте оператор -> для доступа к членам структуры через указатель.

    p->name = "John";
    p->age = 30;
  4. Динамическое выделение памяти для структуры: Используйте оператор new для создания структуры в динамической памяти.

    Person *p = new Person;
    p->name = "John";
    p->age = 30;
  5. Освобождение памяти: Используйте оператор delete для освобождения памяти, выделенной оператором new.

    delete p;

Пример:

#include <iostream>
using namespace std;
 
struct Person {
    string name;
    int age;
 
    Person() : name("Unknown"), age(0) {}
    Person(string n, int a) : name(n), age(a) {}
 
    void display() const {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};
 
int main() {
    // Статическое создание объекта и указателя на него
    Person person1("Alice", 28);
    Person *p1 = &person1;
 
    p1->display(); // Использование указателя для вызова метода
 
    // Динамическое создание объекта
    Person *p2 = new Person("Bob", 35);
 
    p2->display(); // Использование указателя для вызова метода
 
    // Освобождение памяти
    delete p2;
 
    return 0;
}

Особенности

  • Оператор -> используется для доступа к членам структуры через указатель.
  • Динамическое выделение памяти требует явного освобождения памяти с помощью delete.
  • Указатели могут быть переданы в функции, что позволяет работать с большими структурами без их копирования.

Передача указателя в функцию:

void updateName(Person *p, const string &newName) {
    p->name = newName;
}
 
int main() {
    Person person("John", 30);
    updateName(&person, "Jack");
    person.display(); // Name: Jack, Age: 30
    return 0;
}