Menu
Coddy logo textTech

Оператор «стрелка» (->)

Часть раздела 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.

challenge icon

Задание

Легко

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

  1. Определить структуру struct с именем Book со следующими членами:
    • Целое число id для хранения идентификатора книги
    • Символьный массив title размером 40 для хранения названия книги
    • Символьный массив author размером 30 для хранения имени автора
    • Число с плавающей точкой price для хранения цены книги
    • Целое число pages для хранения количества страниц
  2. В функции main создать переменную типа Book с именем myBook
  3. Объявить указатель на структуру Book с именем bookPtr
  4. Присвоить адрес myBook указателю bookPtr
  5. Считать следующие входные значения и присвоить их членам структуры, используя оператор «стрелка» через указатель:
    • Считать целое число для ID и присвоить его, используя bookPtr->id
    • Считать строку для названия и присвоить ее, используя bookPtr->title
    • Считать строку для автора и присвоить ее, используя bookPtr->author
    • Считать число с плавающей точкой для цены и присвоить его, используя bookPtr->price
    • Считать целое число для количества страниц и присвоить его, используя bookPtr->pages
  6. После считывания всех значений выполнить следующие операции, используя оператор «стрелка»:
    • Применить скидку 10% к цене: bookPtr->price = bookPtr->price * 0.9;
    • Добавить 50 бонусных страниц: bookPtr->pages += 50;
  7. Вывести информацию о книге, используя оператор «стрелка» для доступа к каждому члену в точно таком формате:
    • Book Information:
    • ID: [id]
    • Title: [title]
    • Author: [author]
    • Price: [price]
    • Pages: [pages]
  8. Рассчитать и вывести цену за страницу, используя оператор «стрелка», в формате: 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;
}
quiz iconПроверьте себя

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

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