Структуры
Прежде чем говорить о структурах, вспомним массивы. Как вы, наверное, помните, массивы предназначены для хранения однотипных данных. Другими словами, каждый элемент массива представляет собой значение определенного типа: целое число, символ, строка. Но зачастую, в программах, требуется хранить в одном месте данные разных типов.

В качестве примера рассмотрим программу которая хранит список книг в библиотеке. Про каждую книгу нам известно: название, автор, год издания, количество экземпляров, стоимость книги.
Типы переменных, используемые для хранения подобных данных необходимо взять такие:
string – название, автор
int – год издания, количество экземпляров
float – стоимость книги.

Возможная реализация представляется таким образом: завести для каждого отдельного качества отдельный массив. Например:
string author[100];    // автор
string title[100];     // название
int year[100];         // год издания
int count[100];        // количество экземпляров
float price[100];      //стоимость

Теперь для того, чтобы вывести информацию о какой-либо книге, мы можем обратиться по i-му номеру к соответствующему элементу массиву. 

Например,
cout << author[3] << ". " << title[3] << ". " << year[3] << " year";

Теперь представим, что нам надо отсортировать список книг в определенном порядке. Как поступить? Реализация сортировки будет достаточно сложной. Описывая таким образом данные, мы получили 5 массивов, которая логически между собой не связаны. Придется постоянно при сортировке сортировать сразу все массивы. Достаточно неудобно и есть вероятность забыть про что-то.
Хочется, чтобы все эти массивы были объединены в один какой-то блок, с которым можно было бы работать как с единым объектом.
Для таких целей и служат структуры.
 
Структура - это тип данных, предназначенный для объединения данных различных типов в единое целое. Структура может включать в себя несколько полей - элементов разных типов (в том числе и другие структуры).

Давайте попробуем нашу информацию описать в виде структуры.
Прежде чем  использовать структуру (как и любую другую переменную) ее нужно объявить (описать внутреннюю структуру, можно назвать это шаблоном).
 
Описание структуры
struct /* имя_структуры */ {
  /* переменные-члены структуры */
};

Таким образом, мы можем под одним именем объединить самые разные данные. Это могут быть простые типы данных или даже массивы. Причем сама структура может также быть и массивом. Тогда она будет называться массив-структур.

Имя структуры фактически является новым типом данных, который мы можем использовать в программе, также как и любой другой тип. Обычно структуры описываются сразу после подключения заголовочных файлов. Иногда, для удобства, описание структур выносят в отдельный заголовочный файл.

Возвращаясь к нашему примеру, опишем структуру book с полями author, title, year, count, price соответствующих типов.
struct book 
{ 
  string author; // автор 
  string title; // название 
  int year; // год издания 
  int count; // количество экземпляров 
  float price; //стоимость 
}; 
В качестве полей структуры могут выступать любые встроенные типы данных и даже другие структуры.
На имена полей накладываются те же ограничения, что и на обычные переменные. Внутри одной структуры не должно быть полей с одинаковыми именами.

Для обращения к отдельным полям структуры используют так называемую точечную записьразделяя точкой имя структуры и имя поля.
Например,
b.author обозначает "поле author структуры b"

C полями структуры можно обращаться также, как и с обычными переменными соответствующего типа. Можно вводить значения полей с клавиатуры, выводить значения на экран, присваивать значения. То есть работать как с обычной переменной. 

Например,
getline(cin, b.author);
getline(cin, b.title);
cin >> b.count;