C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C struct. Визначення структур


Структури


визначення структур

Структура в мові програмування Сі є похідним типом даних, який об'єднує в єдине ціле безліч компонентів. При цьому на відміну від масиву ці компоненти можуть представляти різні типи даних.

Для визначення структури застосовується ключове слово struct , а сам формат визначення виглядає наступним чином:

struct імя_структури
{
    компоненти_структури
};

Імя_структури представляє довільний ідентифікатор, до якого застосовуються ті ж правила, що і при найменуванні змінних.

Після імені структури в фігурних дужках поміщаються Компоненти_структури , які представляють набір описів об'єктів, які становлять структуру.

Слід зазначити, що на відміну від функції при визначенні структури після закриває фігурної дужки йде крапка з комою.

Наприклад, визначимо найпростішу структуру:

struct person
{
    int age;
    char * name;
};

Тут визначена структура person , яка має два елементи: age (представляє тип int) і name (представляє покажчик на тип char).

Всі елементи структури оголошуються як звичайні змінні. Але на відміну від змінних при визначенні елементів структури для них не виділяється пам'ять, і їх не можна форматувати. По суті ми просто визначаємо новий тип даних.

Після визначення структури ми можемо її використовувати. Для початку ми можемо визначити об'єкт структури - по суті звичайну змінну, яка буде представляти вище створений тип:

struct person tom;

Тут визначена змінна tom, яка представляє структуру person. І при кожному визначенні змінної типу структури їй буде виділятися пам'ять, необхідна для зберігання її елементів.

При визначенні змінної структури її можна відразу форматувати, присвоївши якесь значення:

struct person tom = {23, "Tom"};

Ініціалізація структур аналогічна ініціалізації масивів: в фігурних дужках передаються значення для елементів структури по порядку. Так як в структурі person першим визначено властивість, яке представляє тип int - число, то в фігурних дужках спочатку йде число. І так далі для всіх елементів структури по порядку.

Також після створення змінної структури можна звертатися до її елементів - отримувати їх значення або, навпаки, присвоювати їм нові значення. Для звернення до елементів структури використовується операція "крапка":

імя_змінної_структури.імя_елемента

Тепер об'єднаємо всі разом в рамках програми:

#include <stdio.h>
 
struct person
{
    int age;
    char * name;
};
 
int main(void)
{
    struct person tom = {23, "Tom"};
    printf("Age: %d \t Name: %s", tom.age, tom.name);
    return 0;
}

Консольний висновок програми:

#include <stdio.h>
 
struct person
{
    int age;
    char name[20];
};
int main(void)
{
    struct person tom = {23, "Tom"};
    printf("Enter name: ");
    scanf("%s", &tom.name);
    printf("Enter age: ");
    scanf("%d", &tom.age);
    printf("Name:%s \t Age: %d", tom.name, tom.age);
    return 0;
}

Консольний висновок програми:

#include <stdio.h>
 
struct person
{
    int age;
    char * name;
} tom, bob, alice;
 
int main(void)
{
    tom.name ="Tom";
    tom.age = 23;
    bob.name ="Bob";
    bob.age = 15;
    alice.name = "Alice";
    alice.age=25;
    printf("Name:%s \t Age: %d", tom.name, tom.age);
    return 0;
}

Після визначення структури, але до точки коми ми можемо через кому перерахувати набір змінних. А потім привласнити їх елементам значення.

При подібному визначенні ми можемо навіть не вказувати ім'я структури:

struct
{
    int age;
    char * name;
} tom, bob, alice;

В цьому випадку компілятор все одно буде знати, що змінні tom, bob і alice представляють структури з двома елементами name і age. І відповідно ми також з цими змінними зможемо працювати. Інша справа, що ми не зможемо поставити нові змінні цієї структури в інших місцях програми.


typedef

Ще один спосіб визначення структури представляє ключове слово typedef :

#include <stdio.h>
 
typedef struct
{
    int age;
    char * name;
} person;
 
int main(void)
{
    person tom = {23, "Tom"};
    printf("Name:%s \t Age: %d", tom.name, tom.age);
    return 0;
}

В кінці визначення структури після закриває фігурної дужки йде її позначення - в даному випадку person . Надалі ми можемо використовувати це позначення для створення змінної структури. При цьому на відміну від прикладів вище тут не треба при визначенні змінної не треба використовувати слово struct .


Директива define

Ще один спосіб визначити структуру представляє застосування препроцесорної директиви #define :

#include <stdio.h>
 
#define PERSON struct {int age; char name[20];}
 
int main(void)
{
    PERSON tom = {23, "Tom"};
    printf("Name:%s \t Age: %d", tom.name, tom.age);
    return 0;
}

В даному випадку директива define визначає константу PERSON , замість якої при обробці вихідного коду препроцесором вставлятиметься код структури struct {int age; char name[20];}


Наш партнер:
beta test mp3 playlist downloader