Оператор стрелка указатель на член структуры в Си

Перед чтением этой статьи убедитесь, что Вы знакомы со структурами и указателями

По-английски этот оператор называется member selection operator

Зайдём издалека:

Пусть у нас есть структрура Website

Пусть у этой структуры есть три члена name, year, rating

И у нас есть объект типа Website, который называется site1

Мы можем создать указатель на этот объект. Помним, что:

Тип указателя должен соответствовать типу объекта на который он указывает.

Поэтому синтаксис будет такой:

struct Website * ptr;

так мы задаём правильный тип указателя.

Теперь можно тыкнуть указателем на нужный объект

ptr = &heihei.ru

Всё как обычно. Создали указатель и он указывает куда надо.

Но у стуктуры есть члены: name, year, rating, поэтому встаёт вопрос - как к ним обратиться?

Эту задачу и решает ->

Мы можем написать ptr->name, ptr->year, ptr->rating и всё готово.

#include <stdio.h> struct Website { char name[80]; int year; float rating; }; int main() { struct Website site1={"heihei.ru", 2018, 30.5}; struct Website *ptr; // по аналогии с указателями типа char или int мы создаём // указатель типа struct Website ptr = &site1; printf("%s %d %.1f\n", ptr->name, ptr->year, ptr->rating); return 0; }

gcc -o mso_example mso_example.c
./mso_example

heihei.ru 2018 30.5

Задача

Замените строку

printf("%s %d %.1f\n", ptr->name, ptr->year, ptr->rating);

На

printf("%s %d %.1f\n", *ptr.name, *ptr.year, *ptr.rating);

Изучите ошибку, которую выдаст компилятор и постарайтесь устранить.

Решение чуть ниже

Решение

Мой компилятор GCC выдаёт следующую ошибку

mso_example.c: In function ‘main’: mso_example.c:19:32: error: ‘ptr’ is a pointer; did you mean to use ‘->’? printf("%s %d %.1f\n", *ptr.name, *ptr.year, *ptr.rating); ^ -> mso_example.c:19:43: error: ‘ptr’ is a pointer; did you mean to use ‘->’? printf("%s %d %.1f\n", *ptr.name, *ptr.year, *ptr.rating); ^ -> mso_example.c:19:52: error: ‘ptr’ is a pointer; did you mean to use ‘->’? printf("%s %d %.1f\n", *ptr.name, *ptr.year, *ptr.rating); ^ ->

Он пытается обработать точку между ptr и name и подсказывает, что вместо точки нужна стрелка.

Он не видит * перед ptr потому что приоритет оператора точка выше, чем у *

Нужно взять все *ptr в скобки (*ptr)

printf("%s %d %.1f\n", (*ptr).name, (*ptr).year, (*ptr).rating);

Предыдущий урок: Структуры

Похожие статьи
Программирование на Си
Основы Си
Учебник по Си
Boolean в Си
Сокеты в Си
К и Р
Что такое argc, char * argv[]
Функция scanf()
Указатели
Структуры в Си
Запросы к REST API на Си