Вказівники Всередині Структур
Основні структури даних, такі як стек, зв'язаний список та дерева, можуть містити посилання на інші об'єкти того ж типу для створення зв'язків або відносин між елементами. Структури даних будуть розглянуті пізніше у цьому курсі.
Елементи таких структур даних зазвичай називають вузлами.
Якщо спробувати створити структуру, що містить поле того ж типу, що й сама структура, виникне помилка:
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
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.
У мовах програмування, таких як C та C++, вказівник зі значенням NULL зазвичай означає кінець списку (або іншої структури даних). Тому цей цикл буде виконуватися, поки pointer є NULL, що можна трактувати як досягнення кінця списку або структури даних.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 4.35
Вказівники Всередині Структур
Свайпніть щоб показати меню
Основні структури даних, такі як стек, зв'язаний список та дерева, можуть містити посилання на інші об'єкти того ж типу для створення зв'язків або відносин між елементами. Структури даних будуть розглянуті пізніше у цьому курсі.
Елементи таких структур даних зазвичай називають вузлами.
Якщо спробувати створити структуру, що містить поле того ж типу, що й сама структура, виникне помилка:
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
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.
У мовах програмування, таких як C та C++, вказівник зі значенням NULL зазвичай означає кінець списку (або іншої структури даних). Тому цей цикл буде виконуватися, поки pointer є NULL, що можна трактувати як досягнення кінця списку або структури даних.
Дякуємо за ваш відгук!