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