Оператор стрелка указатель на член структуры в Си
Перед чтением этой статьи убедитесь, что Вы знакомы со структурами и указателями
По-английски этот оператор называется 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 на Си |