Оператор «стрелка» (->)
Часть раздела Logic & Flow путешествия по C на Coddy — урок 45 из 63.
При работе с указателями на структуры для доступа к членам структуры требуется специальный синтаксис. Хотя вы могли бы использовать оператор разыменования и точечную нотацию вместе, C предоставляет более удобный оператор специально для этой цели: оператор «стрелка» (->).
Оператор «стрелка» позволяет обращаться к членам структуры через указатель чистым и понятным способом:
ptr->memberЭто эквивалентно записи (*ptr).member, но гораздо лаконичнее.
Вот как это работает на практике:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Использование оператора «стрелка»
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Это то же самое, что и:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);Оператор «стрелка» делает ваш код чище и понятнее, особенно при работе со сложными структурами данных. Это стандартный способ доступа к членам структур через указатели в программировании на C.
Задание
ЛегкоСоздайте программу на языке C, которая демонстрирует использование оператора «стрелка» для доступа к членам структуры через указатели. Ваша программа должна:
- Определить структуру
structс именемBookсо следующими членами:- Целое число
idдля хранения идентификатора книги - Символьный массив
titleразмером 40 для хранения названия книги - Символьный массив
authorразмером 30 для хранения имени автора - Число с плавающей точкой
priceдля хранения цены книги - Целое число
pagesдля хранения количества страниц
- Целое число
- В функции main создать переменную типа
Bookс именемmyBook - Объявить указатель на структуру
Bookс именемbookPtr - Присвоить адрес
myBookуказателюbookPtr - Считать следующие входные значения и присвоить их членам структуры, используя оператор «стрелка» через указатель:
- Считать целое число для ID и присвоить его, используя
bookPtr->id - Считать строку для названия и присвоить ее, используя
bookPtr->title - Считать строку для автора и присвоить ее, используя
bookPtr->author - Считать число с плавающей точкой для цены и присвоить его, используя
bookPtr->price - Считать целое число для количества страниц и присвоить его, используя
bookPtr->pages
- Считать целое число для ID и присвоить его, используя
- После считывания всех значений выполнить следующие операции, используя оператор «стрелка»:
- Применить скидку 10% к цене:
bookPtr->price = bookPtr->price * 0.9; - Добавить 50 бонусных страниц:
bookPtr->pages += 50;
- Применить скидку 10% к цене:
- Вывести информацию о книге, используя оператор «стрелка» для доступа к каждому члену в точно таком формате:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- Рассчитать и вывести цену за страницу, используя оператор «стрелка», в формате:
Price per page: [price_per_page]
Эта задача проверяет ваше понимание оператора «стрелка» для доступа к членам структуры через указатели. Вы попрактикуетесь в использовании синтаксиса ptr->member как для чтения, так и для записи в члены структуры, убедившись, что это эквивалентно (*ptr).member, но гораздо удобнее и читабельнее.
Шпаргалка
Оператор «стрелка» (->) предоставляет удобный способ доступа к членам структуры через указатель:
ptr->memberЭто эквивалентно (*ptr).member, но более кратко и читабельно.
Пример использования:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Использование оператора стрелка
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Это то же самое, что и:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);Попробуйте сами
#include <stdio.h>
#include <string.h>
// TODO: Определите структуру Book здесь
int main() {
// TODO: Создайте переменную типа Book с именем myBook
// TODO: Объявите указатель на Book с именем bookPtr
// TODO: Присвойте адрес myBook указателю bookPtr
// Чтение входных значений
int id;
char title[40];
char author[30];
float price;
int pages;
scanf("%d", &id);
scanf("%s", title);
scanf("%s", author);
scanf("%f", &price);
scanf("%d", &pages);
// TODO: Присвойте входные значения членам структуры, используя оператор стрелка
// TODO: Примените скидку 10% к цене, используя оператор стрелка
// TODO: Добавьте 50 бонусных страниц, используя оператор стрелка
// TODO: Выведите информацию о книге, используя оператор стрелка
// TODO: Рассчитайте и выведите цену за страницу, используя оператор стрелка
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции