Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 16:

Структуры

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >

Определение размера памяти, выделяемой под структуру

Размер памяти, занимаемый структурным объектом, можно вычислить, исходя из размеров элементов структуры либо с помощью операции:

sizeof (ИмяСтруктуры)
sizeof (ИмяСтруктурногоТипа)

Определение структурного типа не связано с выделением памяти под сам тип, а при каждом определении структуры (объекта) ей выделяется память в таком количестве, чтобы могли разместиться данные всех элементов. Однако стандарт языка С++ не дает гарантий, что элементы структур будут размещаться непрерывно. Причиной появления неиспользованных участков памяти ("дыр") могут явиться требования выравнивания данных по границам участков адресного пространства. Эти требования зависят от реализации, от аппаратных возможностей системы и иногда от режимов (опций) работы компилятора.

Например:

sizeof(struct goods) – 24 байта (из Примера 1)

sizeof(goods) – 24 байта (из Примера 1)

sizeof coat – 24 байта (из Примера 1)

sizeof(complex) – 16 байтов (из Примера 2)

Пример 3. Программа вывода размера памяти для структурного объекта

#include "stdafx.h"
#include <iostream>
using namespace std;
  struct A {
            int j;
            char titl[10];
            char x;
           } Aa, Ab={128, "Мир", 'Q'};

int _tmain(int argc, _TCHAR* argv[]) {
  printf("\nAb.j=%d Ab.titl=%s Ab.x=%c", Ab.j, Ab.titl, Ab.x);
  printf("\nПамять для объекта Аа равна %d байт ", sizeof (Aa));
  system("pause");
  return 0;
}

Результат выполнения программы:

Ab.j=128 Ab.titl=Мир Ab.x=Q
Память для объекта Аа равна 16 байт

Массивы структур

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

Массивы структур широко используются для структурной организации данных в прикладных программах и системном программном обеспечении.

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

Например:

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {
  struct Student {
                  char name[30];
                  char group[10];
                  float rating;
                 };
  Student mas[35]; //массив структур
  int i;

  //ввод значений массива
  for(int i=0;i<35;i++){
    cout << "\nВведите имя: ";cin >> mas[i].name;
    cout << "\nВведите группу: ";cin >> mas[i].group;
    cout << "\nВведите рейтинг: ";cin >> mas[i].rating;
  }
  //вывод студентов, у которых рейтинг меньше 3
  cout << "Рейтинг < 3: ";
  for(i=0; i<35; i++)
    if(mas[i].rating<3)
      cout << "\n" << mas[i].name;
  system("pause");
  return 0;
}

Пример 4. Программа определяет и печатает название самой высокой вершины из списка

#include "stdafx.h"
#include <iostream>
using namespace std;
struct peak {
             char name[15];//название вершины
             int height; //высота вершины
            } list[30]; //массив структурного типа peak
int N;

void InputDate();
void PrintMaxPic();

int _tmain(int argc, _TCHAR* argv[]) {
  InputDate();
  printf("\n");
  PrintMaxPic();
  system("pause");
  return 0;
}

void InputDate() {
int i;
  printf("Введите количество вершин: "); scanf("%d",&N);
  printf("\n");
  for (i=0; i<N; i++) {
    printf("Название: ");
    scanf("%s",&list[i].name);
    printf("Вершина: ");
    scanf("%d",&list[i].height);
  }
}

void PrintMaxPic(){
int i,max=list[0].height,num=0;
  for (i=1; i<N; i++)
    if (list[i].height>max) {
      max=list[i].height;
      num=i;
    }
  printf("Самая высокая вершина - %s, она равна ­ %d", 
          list[num].name,max);
}

Пример 5. Программа инициализирует массив структур, сортирует и выводит его на печать.

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <time.h>
#define num 5
struct {
        char name[15];
        int grade;
       } x[num];

void init(void);
int sorts(const void *p1, const void *p2);
void print(void);

int _tmain(int argc, _TCHAR* argv[]) {
  printf("\n Введите имена:\n");
  init();
  printf("\n Первоначальный массив\n"); 
  print();
  printf("\n Отсортированный массив\n");
  qsort((void *)x, num, sizeof(x[0]), sorts);
  print();
  system("pause");
  return 0;
}

void init(void){
  int i, a=-10, b=10;  
  srand(time(NULL)*1000);
  for (i=0; i!=num; i++){
    gets(x[i].name);
    x[i].grade =int(rand()*1.0/(RAND_MAX)*(b-a)+a);
  }
}

//сортируем по имени
int sorts(const void *p1, const void *p2){
  return( strcmp((char *)p1,(char *)p2));
}

void print(void){
  int t;
  for (t = 0; t != num; t++)
    printf("%s\t\t%d\n", x[t].name, x[t].grade);
}

Ключевые термины

Агрегатный тип данных – это тип, конструируемый из элементов независимых (возможно различных) типов.

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

Массив структур – это массив, каждый элемент которого является структурой.

Поименованный шаблон – это одна из основных форм объявления структур, задаваемая именем структурного типа и определениями элементов.

Поля структуры – это составные части структуры, характеризующиеся именем, типом и размером.

Размер структуры – это объем памяти, занимаемой структурой.

Структура – это составной объект, в который входят элементы любых типов, за исключением функций.

Краткие итоги

  1. Структура является представителем агрегатного типа данных в языке С++.
  2. Существует три основные формы объявления структур: с поименованным шаблоном, с совмещением определения структуры структурных объектов, с использованием оператора typedef.
  3. Инициализация структуры заключается в присваивании начальных значений элементам структуры.
  4. Для структур можно выполнить операцию прямого присваивания.
  5. Доступ к элементам структур (полям данным) можно осуществить с помощью операций прямого и косвенного выбора.
  6. Размер памяти, занимаемой структурой, зависит от реализации и вычисляется с помощью операции sizeof.
  7. Для решения прикладных задач используются массивы структур.
< Лекция 15 || Лекция 16: 1234 || Лекция 17 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Андрей Садовщиков
Андрей Садовщиков
Россия