НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Мова програмування C. Уроки W3Schools для початківців українською мовою

En Es De

C Структури (конструкції)


Структури

Структури (також звані конструкціями) — це спосіб згрупувати кілька пов’язаних змінних в одному місці. Кожна змінна в структурі відома як елемент структури.

На відміну від масиву, структура може містити багато різних типів даних (int, float, char тощо).


Створити структуру

Ви можете створити структуру за допомогою ключового слова struct і оголосити кожен її член у фігурних дужках:

struct MyStructure {   // Оголошення структури
  int myNum;           // Член (змінна int)
  char myLetter;       // Член (змінна char)
}; // Закінчуйте структуру крапкою з комою

Щоб отримати доступ до структури, ви повинні створити її змінну.

Використовуйте ключове слово struct у методі main(), а потім назву структури, а потім назву структурної змінної:

Створіть структурну змінну з іменем "s1":

struct myStructure {
  int myNum;
  char myLetter;
};

int main() {
  struct myStructure s1;
  return 0;
}

Доступ до елементів структури

Щоб отримати доступ до елементів структури, використовуйте синтаксис крапки (.):

Приклад

// Створіть структуру під назвою myStructure
struct myStructure {
  int myNum;
  char myLetter;
};

int main() {
  // Створіть структурну змінну myStructure під назвою s1
  struct myStructure s1;

  // Присвоїти значення елементам s1
  s1.myNum = 13;
  s1.myLetter = 'B';

  // Роздрукувати значення
  printf("My number: %d\n", s1.myNum);
  printf("My letter: %c\n", s1.myLetter);

  return 0;
}
Спробуйте самі »

Тепер ви можете легко створити кілька структурних змінних з різними значеннями, використовуючи лише одну структуру:

Приклад

// Створіть різні структурні змінні
struct myStructure s1;
struct myStructure s2;

// Присвоюйте значення різним структурним змінним
s1.myNum = 13;
s1.myLetter = 'B';

s2.myNum = 20;
s2.myLetter = 'C';
Спробуйте самі »

Як щодо рядків у структурах?

Пам’ятайте, що рядки в C насправді є масивом символів, і, на жаль, ви не можете призначити значення масиву таким чином:

Приклад

struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];  // String
};

int main() {
  struct myStructure s1;

  // Спроба призначити значення рядку
  s1.myString = "Some text";

  // Спроба надрукувати значення
  printf("My string: %s", s1.myString);

  return 0;
}

Виникне помилка:

prog.c:12:15: error: assignment to expression with array type
Спробуйте самі »

Однак для цього є вихід! Ви можете використати функцію strcpy() і призначити значення s1.myString, як це:

Приклад

struct myStructure {
  int myNum;
  char myLetter;
  char myString[30]; // String
};

int main() {
  struct myStructure s1;

  // Призначте значення рядку за допомогою функції strcpy
  strcpy(s1.myString, "Some text");

  // Роздрукуйте значення
  printf("My string: %s", s1.myString);

  return 0;
}

Результат:

My string: Some text
Спробуйте самі »

Простіший синтаксис

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

Просто вставте значення в список, розділений комами, у фігурні дужки {}. Зауважте, що вам не потрібно використовувати функцію strcpy() для рядкових значень за допомогою цієї техніки:

Приклад

// Створіть структуру
struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
  // Створіть структурну змінну та присвойте їй значення
  struct myStructure s1 = {13, 'B', "Some text"};

  // Надрукувати значення
  printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);

  return 0;
}
Спробуйте самі »

Примітка: Порядок вставлених значень має відповідати порядку типів змінних, оголошених у структурі (13 для int, 'B' для char тощо).


Копіювати структури

Ви також можете призначити одну структуру іншій.

У наступному прикладі значення s1 копіюються в s2:

Приклад

struct myStructure s1 = {13, 'B', "Some text"};
struct myStructure s2;

s2 = s1;
Спробуйте самі »

Змінити значення

Якщо ви хочете змінити/модифікувати значення, ви можете використовувати синтаксис крапки (.).

А щоб змінити значення рядка, знову корисна функція strcpy():

Приклад

struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
 // Створіть структурну змінну та присвойте їй значення
  struct myStructure s1 = {13, 'B', "Some text"};

  // Змінити значення
  s1.myNum = 30;
  s1.myLetter = 'C';
  strcpy(s1.myString, "Something else");

  // Надрукувати значення
  printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);

  return 0;
}
Спробуйте самі »

Зміна значень особливо корисна, коли ви копіюєте значення структури:

Приклад

// Створіть структурну змінну та присвойте їй значення
struct myStructure s1 = {13, 'B', "Some text"};

// Створіть іншу структурну змінну
struct myStructure s2;

// Скопіюйте значення s1 до s2
s2 = s1;

// Змініть значення s2
s2.myNum = 30;
s2.myLetter = 'C';
strcpy(s2.myString, "Something else");

// Надрукувати значення
printf("%d %c %s\n", s1.myNum, s1.myLetter, s1.myString);
printf("%d %c %s\n", s2.myNum, s2.myLetter, s2.myString);
Спробуйте самі »

Отже, чим корисні структури?

Уявіть, що вам потрібно написати програму для зберігання різної інформації про автомобілі, наприклад марки, моделі та року випуску. Що чудово в структурах, так це те, що ви можете створити єдиний «шаблон автомобіля» та використовувати його для кожного автомобіля, який ви робите. Дивіться приклад із реального життя нижче.


Приклад із реального життя

Використовуйте структуру для зберігання різної інформації про автомобілі (Car):

Приклад

struct Car {
  char brand[50];
  char model[50];
  int year;
};

int main() {
  struct Car car1 = {"BMW", "X5", 1999};
  struct Car car2 = {"Ford", "Mustang", 1969};
  struct Car car3 = {"Toyota", "Corolla", 2011};

  printf("%s %s %d\n", car1.brand, car1.model, car1.year);
  printf("%s %s %d\n", car2.brand, car2.model, car2.year);
  printf("%s %s %d\n", car3.brand, car3.model, car3.year);

  return 0;
}
Спробуйте самі »

C Вправи

Перевірте себе за допомогою вправ

Вправа:

Заповніть відсутню частину, щоб створити структуру автомобіля:

 Car {
  char brand[50];
  char model[50];
  int year;
};