Типи даних в “Сі”. Програмування на мові Сі”

Типи даних в Сі – клас даних, значення яких мають схожі характеристики. Тип визначає внутрішнє подання даних у пам’яті. Основні типи даних: логічний, цілочисельний, числа з плаваючою точкою, рядкові, покажчики.

Типізація

При динамічної типізації мінлива зв’язується з типом на момент ініціалізації. Виходить, що змінна в різних ділянках коду може мати різні типи. Динамічну типізацію підтримують Java Script, Python, Ruby, PHP.

Статична типізація є протилежністю динамічної. При оголошенні мінлива отримує тип, який не змінюється в подальшому. Мови Сі і Сі++ є саме такими. Цей спосіб найбільш зручний для написання складного коду, а на стадії компіляції виключається багато помилок.

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

x = 1 + “2”; //помилка – не можна додати до числа символьний знак

Приклад слабкою типізації.

x = 1 + “2”; // 3

Перевірка узгодження типів здійснюється системою типобезопасности. Помилка типізації виникає, наприклад, при спробі використовувати число як функцію. Існують нетипизированные мови. В протилежність типізованих, вони дозволяють здійснювати будь-які операції над кожним об’єктом.

Класи пам’яті

Змінні, незалежно від їх типу, мають свою область видимості і час існування.

Класи пам’яті:

  • auto;
  • static;
  • extern;
  • register.

Всі змінні в мові Сі за замовчуванням є локальними. Вони можуть використовуватися тільки усередині функції або блоку. По завершенні функції їх значення знищується.

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

Зовнішня змінна є глобальною. Вона доступна в будь-якій частині коду і навіть в іншому файлі.

Реєстрова мінлива рекомендує компілятору зберігати значення в оперативну пам’ять.

Специфікатори типів даних в Сі можуть не вказуватися у таких випадках:

  • Всі змінні всередині блоку не є змінними, відповідно, якщо передбачається використання саме цього класу пам’яті, то спецификатор auto не вказується.
  • Всі функції, оголошені поза блоку або функції, є за замовчуванням глобальними, тому спецификатор extern не обов’язковий.
  • Базові типи

    Для вказівки простих типів зазначаються специфікатори int, char, float та double. До змінних можуть підставлятися модифікатор unsigned (беззнаковий), signed (знаковий), short, long, long long.

    За замовчуванням усі числа є знаковими, відповідно, можуть перебувати в діапазоні тільки позитивних чисел. Щоб визначити змінну типу char як знакову, пишеться signed char. Long, long long і short вказують, як багато місця в пам’яті відводиться для зберігання. Найбільше – long long, найменше – short.

    Char – найменший тип даних в мові Сі. Для зберігання значень виділяється всього 1 байт пам’яті. Змінної типу character зазвичай присвоюються символи, рідше – цифри. Символьні значення беруться в лапки.

    char a = a”;

    char b = 2;

    Тип int зберігає цілі числа, його розмір не визначений займає до 4 байт пам’яті, в залежності від архітектури комп’ютера.

    int a = 12;

    Явне перетворення беззнаковой змінної задається так:

    unsigned int a = 12;

    Неявне виглядає так:

    int a = 12u;

    Float і double визначають числа з крапкою. Числа float представляються у вигляді -2.3 або 3.34. Double використовується для більшої точності – після роздільника цілої та дробової частини вказується більше цифр. Цей тип займає більше місця в пам’яті, ніж float.

    double a = 12.4567;

    Void має пусте значення. Він визначає функції, які нічого не повертають. За допомогою цього специфікатора вказується пусте значення в аргументах методів. Покажчики, які можуть приймати будь-який тип даних, також визначаються як void.

    Логічний тип Bool

    Застосовується у перевірках умов і циклах. Має лише два значення:

    • істина;
    • брехня.

    Булеві значення можуть перетворюватися в значення типу int. True еквівалентно одиниці, false – нулю. Перетворення типів передбачено тільки між bool і int, в іншому випадку компілятор видасть помилку.

    int x = 123;

    if (x) { //Error: “Cannot implicitly convert type ‘int’ to ‘bool'”

    };

    if (x != 0) // The C# way

    {

    }

    Рядки та масиви

    Масиви належать до складними типами даними в Сі. МП не працює з рядками так само, як це робить Джаваскрипт або Рубі. В Сі всі рядки є масивами елементів символьного значення. Рядки закінчуються нульовим байтом “”.

    Оголошення рядка Сі: char b[] = { ‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’, ‘’};

    Рядок також оголошується в стислому вигляді.

    char a[] = “string”;

    a[1] === b[1]; // ‘t’

    Цілочисельний або символьні масиви оголошуються однаковим чином: тип даних ім’я змінної[розмір масиву].

    int a[100];

    char b[5];

    Подібний синтаксис вказує, що розмір значення int не може бути більше, ніж 100 символів. При створенні масиву бронюється деяку кількість комірок в пам’яті для зберігання елементів. Тому для обробки масивів даних з невідомої розмірністю або такою, яка буде змінюватися, динамічно виділяється пам’ять.

    Багатовимірні масиви оголошуються так:

    int a[2][3];

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

    Ініціалізація багатовимірного масиву:

    int a[2][3] = { 1, 2, 3, 4, 5, 6 };

    a[1]; // [1, 2, 3]

    a[2]; // [4, 5, 6]

    Посилання та покажчики

    Покажчики – головна особливість мови, вони відкривають широкі можливості для роботи з пам’яттю. Вони передають інформацію про розташування іншої змінної в пам’яті. Перед використанням вони, подібно іншим змінним, оголошуються у вигляді type *pointer. Type – тип змінної, pointer – ім’я покажчика.

    Щоб задати вказівником значення іншої змінної, використовуються посилання. Вони передають адреса змінної і використовуються в якості безпечного покажчика.

    int a = 2;

    int *pointer;

    pointer = &a;

    Посилання дозволяють працювати з покажчиком, як з об’єктом.

    У даному випадку &a поверне 0x7340cad2a25c, *pointer – 2, але pointer без “*” – 0x7340cad2a25c.

    Змінюючи значення, ми не міняємо його адресу, тому pointer так само буде посилатися на 0x7340cad2a25c, але при цьому змінить своє значення.

    Покажчик на інший покажчик оголошується у вигляді:

    int w = 100;

    int *x = &w;

    int **z = &x;

    Покажчик на масив працює трохи іншим способом.

    int c[5] = [1, 2, 3, 4, 5], *a;

    Ми оголосили масив цілих чисел і покажчик int a.

    В цьому випадку покажчик вказує не на сам масив, а тільки на його перший елемент. Таким чином,

    a = c;

    і

    a = &c[0]; //1

    еквівалентні між собою.

    Тепер можна послатися на третій елемент масиву з допомогою виразу

    *(a + 3)

    або

    a[3];

    На прикладі вище, можна зауважити, що додавання в покажчиках працює іншим чином. До них можуть застосовуватися різні арифметичні операції.

    Покажчик на масив зазначається так:

    char (*pa)[10];

    Але масив покажчиків виглядає так:

    char *pc[10];

    Структури

    Структура – такий тип даних в мові Сі, яка полегшує написання і розуміння програм, допомагає групувати дані.

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

    {

    тип1 имя_переменной1;

    тип1 имя_переменной1;

    //інші члени даних;

    }

    Оголошення структурної змінної відбувається після закривають фігурних дужок.

    struct book

    {

    char title[20];

    char autor[30];

    double cast;

    } book1, book2, *ptr_bk;

    Доступ до полів здійснюється за допомогою оператора “.”. Щоб звернутися до змінної title, пишемо:

    book1.title;

    Таким чином, ініціалізуємо змінну

    book1.title = “String”;

    Для звернення до вказівників використовується оператор “->”.

    ptr_bk->cast;

    або оператор “.”.

    (*(ptr_bk)).cast;

    Друга різновид списків з даними – enum (перерахування). Він містить цілочисельні змінні.

    enum { red, blue, green };

    У прикладі оголошено анонімне перерахування, що містить три члена red, blue, green. Перед зверненням до елементів оголошується перечислительная мінлива.

    enum name1 { red, blue, red } varname;

    У цьому випадку name1 є ім’ям перерахування, а varname – ім’я змінної. В момент створення структури можна задати кілька змінних. Вони перераховуються через кому.

    enum name1 { red, blue, red } varname1, varname2, varname3;

    Доступ до членів перерахування задається за допомогою оперетора “.”.

    varname.red = “red”;

    Висновок

    Мова Сі надає великий набір типів. Вони формуються з допомогою відповідних спецификаторов.

    Базові типи поділяються на числові (double, float) та знакові (int, char). Модифікатори signed і unsigned вказують на наявність знака перед символом. Модифікатори long short і відповідають за розмір комірок в пам’яті для зберігання значень змінних. Логічний тип даних має два значення: true і false. Масиви, структури відносяться до складних типів даних. Покажчик працює з адресою змінної, на яку вказує.