Структуры данных

Структуры данных

Программирование » C/C++ » Структуры данных

Основные понятия

Структура - это набор данных, где данные могут быть разного типа. Например, структура может содержать несколько переменных типа int и несколько переменных типа char. Переменные, которые содержаться в структуре называются членами или полями структуры. Структуры можно определять с помощью ключевого слова struct.

Пример описания структуры:

struct student

{

   char name[50];

   int kurs;

   int age;

};

Мы определили структуру в которую входят переменные kurs, age и массив name. В этом описании student является шаблоном структуры, struct student является типом данных. После описания структуры нужно ставить точку с запятой. Чтобы использовать структуру необходимо объявить переменные типа struct student.

Например,

struct student s1, s2;

Переменные s1 и s2 являются переменными типа struct student. Компилятор автоматически выделит память под эти переменные. Под каждую из переменных типа структуры выделяется непрерывный участок памяти.

Для получения доступа к полям структуры используется операция точка. Например,

strcpy(s1.name, "Бардин Павел");

s1.kurs=3;

s1.age=20;

В языке С есть возможность объявлять переменные структуры при описании структуры:

struct student

{

   char name[50];

   int kurs;

   int age;

} s1, s2;

Переменные s1 и s2 являются переменными типа struct student.

Элементами или полями структуры могут быть переменные, массивы, ранее определенные структуры. Функции не могут быть полями структуры (В языке Си). В языке С++ функции могут быть полями структуры и такие структуры называются классами. Они определяются с помощью ключевого слова class.

Для переменных s1 и s2 возможно присваивание

s1=s2

так как эти переменные созданы на базе одного шаблона. После такого присваивания поля структуры s1 будут содержать ту же информацию, что и поля s2. Если мы опишем две структуры с одними и теми же полями, но первая структура будет иметь шаблон student1, а вторая student2, то присваивание s1=s2 недопустимо.

Пример программы.

#include <stdio.h>

// определение структуры

struct student

{

   char name[30];

   int kurs;

   int age;

};

void main()

{

   // объявление переменных stud1 и stud2 типа struct student

   struct student stud1, stud2;

   printf("Введите имя:");

   // ввод имени

   gets(stud1.name);

   printf("Введите возраст:");

   // ввод возраста

   scanf("%d", &stud1.age);

   printf("Введите номер курса:");

   // ввод номера курса

   scanf("%d", &stud1.kurs);

   // присваивание stud2=stud1 возможно, так как один и тот же шаблон

   stud2=stud1;

   // Вывод

   printf("Студент %s\n", stud2.name);

   printf("Курс %d\n", stud2.kurs);

   printf("Возраст %d\n", stud2.age);

}

Заметьте, что когда мы делаем вызов scanf("%d", &stud1.age); и scanf("%d", &stud1.kurs); мы ставим знак & перед именем структуры, а не перед именем поля (элемента структуры).

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

Структуры могут быть объединены в массивы структур. Объявление массива структур делается аналогично объявлению массива переменных. Например, если нужно хранить информацию о 10 студентах, то объявление массива будет следующим

struct student stud1[10];

Здесь stud1 - имя массива структур, а stud1[0] - это первая структура, stud1[1] - вторая... stud1[9] - десятая структура. Чтобы получить доступ к полю age пятой структуры нужно написать

stud1[4].age

Чтобы получить доступ к полю kurs первой структуры нужно написать

stud1[0].kurs

Пример программы.

#include <stdio.h>

// определение структуры

struct student

{

char name[30];

int kurs;

int age;

};

void main()

{

   // объявление массива на 10 структур

   struct student stud[10];

   int i, n;

   printf("Количество студентов:");

   // ввод n (число студентов)

   scanf("%d", &n);

   for(i=0;i<n;i++)

   {

      printf("Введите имя:");

      // ввод имени

      scanf("%s", stud[i].name);

      printf("Введите возраст:");

      // ввод возраста

      scanf("%d", &stud[i].age);

      printf("Введите номер курса:");

      // ввод номера курса

      scanf("%d", &stud[i].kurs);

   }

   // Вывод

   for(i=0;i<n;i++)

   {

      printf("Студент %s\n", stud[i].name);

      printf("Курс %d\n", stud[i].kurs);

      printf("Возраст %d\n", stud[i].age);

   }

}

Доступ к отдельному биту

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

Основная форма объявления структуры с битовыми полями:

struct имя_структуры

{

   тип имя1: длина_в_битах;

   тип имя2: длина_в_битах;

   ...

   тип имяN: длина_в_битах;

}

Здесь тип может быть int, unsigned или signed.

Длина такой структуры всегда кратна восьми. Если определить

struct student

{

   unsigned status: 1;

} stud;

то для переменной stud будет выделено 8 бит, а использоваться будет только один первый бит.




Бардин П.Б. http://proger.ru/

Отзывы (через аккаунты в социальных сетях Вконтакте, Facebook или Google+):

Оставить отзыв с помощью аккаунта ВКонтакте:

Оставить отзыв с помощью аккаунта FaceBook:

Оставить отзыв с помощью аккаунта Google+: