Структуры данных в C++: массивы, структуры и эффективное программирование
Массивы в C/C++ позволяют определять переменные, объединяющие несколько элементов одного типа, но структура — другой пользовательский тип данных, позволяющий объединять элементы разных типов.
Структуры используются для представления записи. Допустим, нужно отслеживать книги в библиотеке. Можно хранить:
- Название
- Автор
- Тема
- ID книги
Определение структуры
Для определения структуры используется оператор struct. Он определяет новый тип данных с более чем одним членом. Формат:
struct [тег_структуры] {
определение_члена;
определение_члена;
...
определение_члена;
} [одна или более переменных_структуры];
Тег структуры опционален. Каждое определение члена — нормальное определение переменной (например, int i; или float f;). В конце, перед точкой с запятой, можно объявить переменные структуры (опционально). Объявление структуры Books:
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
Доступ к членам структуры
Для доступа к члену структуры используется оператор доступа к члену (.). Он записывается как точка между именем переменной структуры и именем члена. Ключевое слово struct используется для объявления переменных структурного типа. Пример:
#include <iostream>
#include <cstring>
using namespace std;
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1; // объявление Book1 типа Book
struct Books Book2; // объявление Book2 типа Book
// спецификация книги 1
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// спецификация книги 2
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// вывод информации о Book1
cout << "Book 1 title : " << Book1.title << endl;
cout << "Book 1 author : " << Book1.author << endl;
cout << "Book 1 subject : " << Book1.subject << endl;
cout << "Book 1 id : " << Book1.book_id << endl;
// вывод информации о Book2
cout << "Book 2 title : " << Book2.title << endl;
cout << "Book 2 author : " << Book2.author << endl;
cout << "Book 2 subject : " << Book2.subject << endl;
cout << "Book 2 id : " << Book2.book_id << endl;
return 0;
}
Результат:
Book 1 title : Learn C++ Programming Book 1 author : Chand Miyan Book 1 subject : C++ Programming Book 1 id : 6495407 Book 2 title : Telecom Billing Book 2 author : Yakit Singha Book 2 subject : Telecom Book 2 id : 6495700
Структуры как аргументы функций
Структуру можно передать в функцию аналогично другим переменным или указателям. Доступ к членам осуществляется так же:
Live Demo#include <iostream>
#include <cstring>
using namespace std;
void printBook(struct Books book);
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1, Book2;
// книга 1
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// книга 2
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// печать
printBook(Book1);
printBook(Book2);
return 0;
}
void printBook(struct Books book) {
cout << "Book title : " << book.title << endl;
cout << "Book author : " << book.author << endl;
cout << "Book subject : " << book.subject << endl;
cout << "Book id : " << book.book_id << endl;
}
Результат аналогичен предыдущему.
Указатели на структуры
Указатели на структуры определяются похоже на указатели на другие переменные:
struct Books *struct_pointer;
Адрес структурной переменной сохраняется в указателе через оператор &:
struct_pointer = &Book1;
Для доступа к членам через указатель используется оператор ->:
struct_pointer->title;
Перепишем пример с указателем на структуру:
Live Demo#include <iostream>
#include <cstring>
using namespace std;
void printBook(struct Books *book);
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1, Book2;
// Книга 1
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// Книга 2
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// печать, передача адреса
printBook(&Book1);
printBook(&Book2);
return 0;
}
void printBook(struct Books *book) {
cout << "Book title : " << book->title << endl;
cout << "Book author : " << book->author << endl;
cout << "Book subject : " << book->subject << endl;
cout << "Book id : " << book->book_id << endl;
}
Результат тот же.
Ключевое слово typedef
Существует более простой способ определять структуры или создавать псевдонимы типов. Например:
typedef struct {
char title[50];
char author[50];
char subject[100];
int book_id;
} Books;
Теперь можно использовать Books напрямую для объявления переменных без ключевого слова struct:
Books Book1, Book2;
typedef работает и для не-структур:
typedef long int *pint32; pint32 x, y, z;
x, y, z — все указатели на long int.
Язык C
- Понимание типов данных C++: основы, модификаторы и лучшие практики
- Освоение операторов C++: полное руководство с практическими примерами
- Комментарии в C++: лучшие практики для читаемого и поддерживаемого кода
- Тип данных char в C++: объявление, ASCII и методы преобразования
- Революция в хранилищах данных: магнитные наноструктуры с мантиями невидимости нового поколения
- Структуры данных в Java: основные классы и Collections Framework
- Структуры в C (struct): определение, инициализация, передача в функции, указатели и битовые поля
- typedef в C: создание псевдонимов типов, упрощение кода и отличия от #define
- Структуры данных в C++: массивы, структуры и эффективное программирование
- Абстракция данных в C++: разделение интерфейса и реализации