Указатели на структуры
Часть раздела Логика и управление потоком путешествия по 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.
Задание
ЛегкоСоздай программу на C, демонстрирующую работу с указателями на структуры. Твоя программа должна:
- Определить
structс именемProductи следующими полями:- Целое число
idдля хранения ID товара - Массив символов
nameразмером 25 для хранения названия товара - Число с плавающей точкой
priceдля хранения цены товара - Целое число
quantityдля хранения доступного количества
- Целое число
- В главной функции создать переменную
Productс именемitemи инициализировать её следующими значениями:- ID: 501
- Название: "Laptop"
- Цена: 899.99
- Количество: 15
- Объявить указатель на структуру
Productс именемitemPtr - Присвоить адрес переменной
itemуказателюitemPtrс помощью оператора взятия адреса - Вывести исходную информацию о товаре, обращаясь напрямую к полям структуры (с помощью оператора точки), в точном формате:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Вывести ту же информацию о товаре, обращаясь к полям структуры через указатель (с помощью оператора разыменования и записи с точкой:
(*itemPtr).member), в точном формате:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Проверить, что указатель указывает на структуру, выведя адреса памяти в точном формате:
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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функцииПотренируйтесь самостоятельно: Онлайн-компилятор C