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

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

Структура - это набор данных, где данные могут быть разного типа. Например, структура может содержать несколько переменных типа 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 бит, а использоваться будет только один первый бит.

Автор: Бардин П.Б.



Опубликовал admin
17 Окт, Воскресенье 2004г.



Натуральный корм для животных
Продажа корма для животных с доставкой без выходных. Закажите
meatfordog.ru
Программирование для чайников.