Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Вказівники Всередині Структур | Робота з Вказівниками та Структурами
Опанування Структур у C

bookВказівники Всередині Структур

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

Note
Примітка

Елементи таких структур даних зазвичай називають вузлами.

Якщо спробувати створити структуру, що містить поле того ж типу, що й сама структура, виникне помилка:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

У цьому випадку виникає нескінченна рекурсія під час визначення розміру такої структури.

Цю ідею можна реалізувати за допомогою вказівника на структуру:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Цей код працює, оскільки компілятор знає точний розмір вказівника — зазвичай 4 або 8 байтів, залежно від системи.
Він не намагається обчислити розмір усієї вкладеної структури; він просто зберігає посилання (address) на неї.

Розглянемо, як це працює на практиці.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - поле next не було явно ініціалізовано в ініціалізаторі структури, тому воно автоматично буде ініціалізовано як нульовий вказівник (NULL), оскільки це стандартне значення для вказівників, коли вони не вказують на жоден об'єкт.

while (pointer != NULL) - цикл буде виконуватися, поки вказівник не вказує на адресу NULL.

Note
Примітка

У мовах програмування, таких як C та C++, вказівник зі значенням NULL зазвичай означає кінець списку (або іншої структури даних). Тому цей цикл буде виконуватися, поки pointer є NULL, що можна трактувати як досягнення кінця списку або структури даних.

question mark

Чому ми не можемо створити структуру, яка містить саму себе?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

bookВказівники Всередині Структур

Свайпніть щоб показати меню

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

Note
Примітка

Елементи таких структур даних зазвичай називають вузлами.

Якщо спробувати створити структуру, що містить поле того ж типу, що й сама структура, виникне помилка:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

У цьому випадку виникає нескінченна рекурсія під час визначення розміру такої структури.

Цю ідею можна реалізувати за допомогою вказівника на структуру:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Цей код працює, оскільки компілятор знає точний розмір вказівника — зазвичай 4 або 8 байтів, залежно від системи.
Він не намагається обчислити розмір усієї вкладеної структури; він просто зберігає посилання (address) на неї.

Розглянемо, як це працює на практиці.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - поле next не було явно ініціалізовано в ініціалізаторі структури, тому воно автоматично буде ініціалізовано як нульовий вказівник (NULL), оскільки це стандартне значення для вказівників, коли вони не вказують на жоден об'єкт.

while (pointer != NULL) - цикл буде виконуватися, поки вказівник не вказує на адресу NULL.

Note
Примітка

У мовах програмування, таких як C та C++, вказівник зі значенням NULL зазвичай означає кінець списку (або іншої структури даних). Тому цей цикл буде виконуватися, поки pointer є NULL, що можна трактувати як досягнення кінця списку або структури даних.

question mark

Чому ми не можемо створити структуру, яка містить саму себе?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 3
some-alt