Освоение структур и указателей в C: практическое руководство
Освоение структур и указателей в C: практическое руководство
Узнайте, как использовать указатели для навигации по членам структур, и изучите динамическое выделение памяти для гибких структур данных в C.
Прежде чем погрузиться в указатели со структурами, ознакомьтесь с базовыми темами:
Использование указателей для ссылки на структуры
Ниже приведен краткий пример, показывающий, как объявить структуру и указатель, ссылающийся на нее.
struct Person {
int member1;
int member2;
/* дополнительные члены */
};
int main(void) {
struct Person *ptr, harry;
/* ptr теперь может указывать на любой экземпляр Person */
}
В этом фрагменте ptr — указатель на экземпляр struct Person.
Пример: Доступ к членам структуры через указатель
Для чтения или записи полей структуры через указатель используйте оператор ->.
#include <stdio.h>
struct Person {
int age;
float weight;
};
int main(void) {
struct Person *personPtr, person1;
personPtr = &person1; /* указывает на person1 */
printf("Enter age: ");
scanf("%d", &personPtr->age);
printf("Enter weight: ");
scanf("%f", &personPtr->weight);
printf("\nDisplaying:\n");
printf("Age: %d\n", personPtr->age);
printf("Weight: %f", personPtr->weight);
return 0;
}
Здесь personPtr = &person1; сохраняет адрес person1 в personPtr. Последующий доступ через personPtr->field эквивалентен (*personPtr).field, предлагая лаконичный синтаксис.
personPtr->ageто же самое, что(*personPtr).agepersonPtr->weightто же самое, что(*personPtr).weight
Динамическое выделение памяти для структур
Когда количество экземпляров структуры заранее неизвестно, выделяйте память во время выполнения с помощью стандартной библиотеки C.
Пример: Выделение массива структур
#include <stdio.h>
#include <stdlib.h>
struct Person {
int age;
float weight;
char name[30];
};
int main(void) {
struct Person *ptr;
int i, n;
printf("Enter the number of persons: ");
scanf("%d", &n);
ptr = (struct Person*)malloc(n * sizeof(struct Person));
if (!ptr) {
fprintf(stderr, "Memory allocation failed\n");
return EXIT_FAILURE;
}
for (i = 0; i < n; ++i) {
printf("Enter first name and age respectively: ");
scanf("%s %d", (ptr + i)->name, &(ptr + i)->age);
}
printf("\nDisplaying Information:\n");
for (i = 0; i < n; ++i) {
printf("Name: %s\tAge: %d\n", (ptr + i)->name, (ptr + i)->age);
}
free(ptr);
return 0;
}
Запуск программы дает:
Enter the number of persons: 2 Enter first name and age respectively: Harry 24 Enter first name and age respectively: Gary 32 Displaying Information: Name: Harry Age: 24 Name: Gary Age: 32
Этот пример демонстрирует, как создать n экземпляров struct Person в куче, считать пользовательский ввод в каждый, а затем вывести результаты.
Язык C
- Понимание ключевых слов и идентификаторов C#: правила, списки и лучшие практики
- Классы и объекты в C#: Фундаменты надёжного ООП
- Абстрактные классы и методы в C#: практическое руководство
- Частичные классы и методы в C#: понимание и применение
- Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
- Понимание структур в C#: определение, использование и ключевые отличия
- Ключевые слова и идентификаторы в C: практическое руководство
- Освоение указателей в C: практическое руководство от экспертов
- Понимание взаимосвязи между массивами и указателями в C
- Передача адресов и указателей в функции в C: практическое руководство