Menu
CoddyTech

Указатели на структуры

Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 44 из 63.

Теперь, когда ты уверенно работаешь со структурами, пора объединить их с ещё одной мощной концепцией C: указателями. Так же как можно создавать указатели на базовые типы данных, такие как int или char, можно создавать и указатели, хранящие адрес переменной-структуры.

Синтаксис объявления указателя на структуру следует той же схеме, что и объявления других указателей:

struct StructureName *pointerName;

Например, используя знакомую нам структуру Point:

struct Point p1 = {10, 20};
struct Point *ptr;

Это создаёт указатель с именем ptr, который может хранить адрес структуры Point. Чтобы указатель действительно указывал на нашу переменную-структуру, используйте оператор взятия адреса:

ptr = &p1;

Чтобы прочитать член через указатель, разыменуйте его, а затем используйте оператор точки. Скобки обязательны, потому что . имеет более высокий приоритет, чем *:

printf("%d", (*ptr).x); // то же самое, что p1.x

Теперь ptr содержит адрес памяти структурной переменной p1. Это открывает новые возможности для работы со структурами, особенно при передаче их функциям или динамическом управлении памятью. Указатели на структуры необходимы для создания более сложных структур данных и написания эффективных программ на C.

challenge icon

Задание

Легко

Создай программу на C, демонстрирующую работу с указателями на структуры. Твоя программа должна:

  1. Определить struct с именем Product и следующими полями:
    • Целое число id для хранения ID товара
    • Массив символов name размером 25 для хранения названия товара
    • Число с плавающей точкой price для хранения цены товара
    • Целое число quantity для хранения доступного количества
  2. В главной функции создать переменную Product с именем item и инициализировать её следующими значениями:
    • ID: 501
    • Название: "Laptop"
    • Цена: 899.99
    • Количество: 15
  3. Объявить указатель на структуру Product с именем itemPtr
  4. Присвоить адрес переменной item указателю itemPtr с помощью оператора взятия адреса
  5. Вывести исходную информацию о товаре, обращаясь напрямую к полям структуры (с помощью оператора точки), в точном формате:
    • Original Product Info:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  6. Вывести ту же информацию о товаре, обращаясь к полям структуры через указатель (с помощью оператора разыменования и записи с точкой: (*itemPtr).member), в точном формате:
    • Product Info via Pointer:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  7. Проверить, что указатель указывает на структуру, выведя адреса памяти в точном формате:
    • Address of item: [address]
    • Value of itemPtr: [address]
    • Address verification: [result]

Для проверки адресов выведи Match, если адреса совпадают, или No Match, если они различаются.

Это задание проверяет твоё понимание объявления указателя на структуру, присваивания адреса с помощью оператора взятия адреса и доступа к полям структуры через указатели с помощью оператора разыменования в сочетании с записью через точку. Также ты проверишь, что указатель правильно хранит адрес переменной-структуры.

Попробуйте сами

#include <stdio.h>
#include <string.h>

// TODO: Определите здесь структуру Product

int main() {
    // TODO: Напишите здесь свой код
    // 1. Создайте и инициализируйте переменную Product 'item'
    // 2. Объявите указатель на Product с именем 'itemPtr'
    // 3. Присвойте адрес 'item' указателю 'itemPtr'
    // 4. Выведите исходную информацию о товаре с помощью оператора точки
    // 5. Выведите информацию о товаре через указатель с помощью (*itemPtr).member
    // 6. Выведите адреса и проверьте их
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор C