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

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

По-английски этот оператор называется 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 на Си

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: