Курс — «Программирование на C для начинающих». Структуры и объединения. #26 Указатели на структуры
Здравствуйте, дорогие друзья.
Указатели на структуры позволяют работать с структурами через их адреса. Это особенно полезно для передачи структур в функции, динамического выделения памяти и работы с массивами структур. В этом разделе мы рассмотрим, как объявлять, инициализировать и использовать указатели на структуры.
Объявление указателей на структуры
Указатель на структуру объявляется с использованием синтаксиса, который включает ключевое слово struct
, имя структуры и звездочку (*
) перед именем указателя. Например, чтобы объявить указатель на структуру Point
, можно использовать следующий синтаксис:
1 2 3 4 5 6 |
struct Point { int x; int y; }; struct Point *ptr; |
Здесь ptr
— это указатель на структуру Point
.
Инициализация указателей на структуры
Указатель на структуру можно инициализировать, присвоив ему адрес существующей структуры. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point p1 = {10, 20}; struct Point *ptr = &p1; // инициализация указателя на структуру printf("Координаты точки p1: (%d, %d)\n", ptr->x, ptr->y); return 0; } |
Доступ к членам структуры через указатель
Для доступа к членам структуры через указатель используется оператор стрелки (->
). Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point p1 = {10, 20}; struct Point *ptr = &p1; printf("Координаты точки p1: (%d, %d)\n", ptr->x, ptr->y); ptr->x = 30; ptr->y = 40; printf("Обновленные координаты точки p1: (%d, %d)\n", ptr->x, ptr->y); return 0; } |
Вывод программы будет следующим:
1 2 |
Координаты точки p1: (10, 20) Обновленные координаты точки p1: (30, 40) |
Передача структур в функции через указатели
Передача структур в функции через указатели позволяет изменять содержимое структуры внутри функции. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <stdio.h> struct Point { int x; int y; }; void updatePoint(struct Point *ptr, int newX, int newY) { ptr->x = newX; ptr->y = newY; } int main() { struct Point p1 = {10, 20}; printf("Координаты точки p1 до обновления: (%d, %d)\n", p1.x, p1.y); updatePoint(&p1, 30, 40); printf("Координаты точки p1 после обновления: (%d, %d)\n", p1.x, p1.y); return 0; } |
Вывод программы будет следующим:
1 2 |
Координаты точки p1 до обновления: (10, 20) Координаты точки p1 после обновления: (30, 40) |
Динамическое выделение памяти для структур
Указатели на структуры также позволяют динамически выделять память для структур с помощью функций malloc
и free
. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <stdio.h> #include <stdlib.h> struct Point { int x; int y; }; int main() { struct Point *ptr = (struct Point *)malloc(sizeof(struct Point)); if (ptr == NULL) { printf("Ошибка выделения памяти\n"); return 1; } ptr->x = 10; ptr->y = 20; printf("Координаты точки: (%d, %d)\n", ptr->x, ptr->y); free(ptr); return 0; } |
Вывод программы будет следующим:
1 |
Координаты точки: (10, 20) |
Массивы структур и указатели
Указатели на структуры можно использовать для работы с массивами структур. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point points[3] = {{1, 2}, {3, 4}, {5, 6}}; struct Point *ptr = points; for (int i = 0; i < 3; i++) { printf("Координаты точки %d: (%d, %d)\n", i, ptr->x, ptr->y); ptr++; } return 0; } |
Вывод программы будет следующим:
1 2 3 |
Координаты точки 0: (1, 2) Координаты точки 1: (3, 4) Координаты точки 2: (5, 6) |
Важные моменты
- Инициализация: Всегда инициализируйте указатели на структуры перед их использованием. Неинициализированные указатели могут указывать на случайные адреса памяти, что может привести к ошибкам.
- NULL указатели: Указатели на структуры можно инициализировать значением
NULL
, чтобы указать, что они не указывают на какую-либо структуру.
1 |
struct Point *ptr = NULL; |
3. Типы данных: Указатели на структуры должны соответствовать типам структур, на которые они указывают.
Указатели на структуры — это мощный инструмент в языке C, который позволяет работать с структурами через их адреса. Это особенно полезно для передачи структур в функции, динамического выделения памяти и работы с массивами структур. Понимание того, как объявлять, инициализировать и использовать указатели на структуры, является ключевым для успешного программирования на C.
На этом все. Всем хорошего дня!