Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Структуры, typedef и оператор -> в C
Объединяйте связанные данные и различайте доступ через объект и через указатель.

struct определяет тип из нескольких полей. Точка обращается к полю объекта, а -> — к полю через действительный указатель. typedef задаёт другое имя типа и сам по себе не выделяет память.
Массив структур хранит записи последовательно. Инициализируйте читаемые поля и соблюдайте вместимость символьных массивов. Копирование структуры копирует поля, но поле-указатель продолжает ссылаться на тот же объект.
Компилятор может добавлять промежутки для выравнивания. Поэтому sizeof структуры бывает больше суммы размеров полей. Сырое представление структуры не следует считать переносимым форматом файла.
Код C
#include <stdio.h>
#include <string.h>
// Typedef struct definition
typedef struct {
int id;
char name[32];
float gpa;
int credits;
} Student;
// Function taking pointer to struct (arrow operator ->)
void print_student(const Student *s) {
printf("ID: %-4d | Name: %-15s | GPA: %.2f | Credits: %d\n",
s->id, s->name, s->gpa, s->credits);
}
// Mutate struct via pointer
void update_gpa(Student *s, float new_gpa) {
s->gpa = new_gpa;
}
int main(void) {
// Array of structs
Student roster[] = {
{101, "Alice Chen", 3.92f, 48},
{102, "Bob Smith", 3.65f, 32},
{103, "Charlie Davis", 3.88f, 60}
};
int total = sizeof(roster) / sizeof(roster[0]);
printf("--- Engineering Class Roster ---\n");
for (int i = 0; i < total; i++) {
print_student(&roster[i]);
}
printf("\n--- Updating Bob's GPA via Pointer (Arrow ->) ---\n");
update_gpa(&roster[1], 3.82f);
print_student(&roster[1]);
return 0;
}Открыть в компилятореОжидаемый вывод
--- Engineering Class Roster --- ID: 101 | Name: Alice Chen | GPA: 3.92 | Credits: 48 ID: 102 | Name: Bob Smith | GPA: 3.65 | Credits: 32 ID: 103 | Name: Charlie Davis | GPA: 3.88 | Credits: 60 --- Updating Bob's GPA via Pointer (Arrow ->) --- ID: 102 | Name: Bob Smith | GPA: 3.82 | Credits: 32
Частые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.