Представь, например, что у тебя есть точка, которая описывается массивом её координат:
typedef int Point2D[2];
И дальше ты делаешь массив таких точек:
Point2D array[5];
А потом ты выводишь их по очереди:
Point2D *p, *q;
for (p = array, q = p + 5; p < q; p++) {
print_point(*p);
}
А вот немного по-другому записано - и у тебя уже прямая получается:
typedef struct {
Point2D *pt1;
Point2D *pt2;
} Line2D;
Почему здесь указатели? Да потому что они жрут меньше памяти, чем массивы чисел. Так одна прямая жрёт 8 байт, а без указателей она жрала бы 16 байт. А была бы прямая в трёхмерном пространстве, то это так же занимало бы 8 байт, а без указателей - 24 байта.
Дальше код пошёл:
код#include <stdio.h>
typedef int Point2D[2];
typedef struct {
Point2D *pt1;
Point2D *pt2;
} Line2D;
void print_point(Point2D p)
{
printf("(%d,%d)\n", p[0], p[1]);
}
void print_line(Line2D l)
{
printf("Line[\n");
print_point(*l.pt1);
print_point(*l.pt2);
printf("Line]\n");
}
int main(void)
{
Point2D array[5] = {{1, 2}, {3, 4}, {5, 6}};
Point2D *p, *q;
Line2D l;
for (p = array, q = p + 5; p < q; p++) {
print_point(*p);
}
l.pt1 = array;
l.pt2 = array + 2;
print_line(l);
return 0;
}
Вывод
[guest@localhost c]$ .ansi t.c -o t
[guest@localhost c]$ ./t
(1,2)
(3,4)
(5,6)
(0,0)
(0,0)
Line[
(1,2)
(5,6)
Line]
[guest@localhost c]$
Как видишь, без этой возможности язык был бы гораздо ограниченней и сдох бы ещё в 80-е годы.