Menu
Coddy logo textTech

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

Часть раздела Logic & Flow путешествия по C на Coddy — урок 44 из 63.

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

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

struct StructureName *pointerName;

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

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

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

ptr = &p1;

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

challenge icon

Задание

Легко

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

  1. Определить struct с именем Product со следующими полями:
    • Целое число id для хранения идентификатора продукта
    • Символьный массив name размером 25 для хранения названия продукта
    • Число с плавающей точкой price для хранения цены продукта
    • Целое число quantity для хранения доступного количества
  2. В функции main создать переменную типа Product с именем item и инициализировать ее следующими значениями:
    • ID: 501
    • Name: "Laptop"
    • Price: 899.99
    • Quantity: 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, если они различаются.

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

Шпаргалка

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

struct StructureName *pointerName;

Чтобы заставить указатель указывать на переменную структуры, используйте оператор взятия адреса:

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

Доступ к членам структуры через указатель осуществляется с помощью оператора разыменования и точечной нотации:

(*ptr).member

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

#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Проверьте себя

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

Все уроки раздела Logic & Flow