Указатель на структуру объявляется точно так же, как и указатель на данные простых типов: используется операция * и указывается тип данных. Тип данных структуры указывается заданием ключевого слова struct и имени шаблона этой структуры.
Пример 1
Объявление указателей:
int        *ip;
struct emp *sp;
Пример 2
#include <stdio.h>
#define NUM_EMPS 100
void fillarray(struct emp *, int);
struct emp {                              /*это шаблон, память не выделяется */
            char   name[21];
            char   id[8];
            double salary;
            };
int main()
{
struct emp staff[NUM_EMPS], *sp;    /*выделяется память под массив структур и под указатель*/
double     sal_tot = 0;

fillarray(staff , NUM_EMPS);             /*заполняет массив структур данными */
for (sp = staff; sp != &staff[NUM_EMPS]; sp++)
      sal_tot += sp->salary;
printf("total of salaries: %.2f\n", sal_tot);

}
Рис. 1.  Указатель на массив структур
В прим. 2 указатель sp после инициализации указывает на начало массива структур staff, т.е. содержит адрес первой структуры массива. Поскольку sp – указатель на структуру, то результат операции *sp является структурой, в данном случае staff[0]. Чтобы обратиться к полю salary структуры staff[0], можно использовать следующие выражения:
Операция доступа к элементу структуры через указатель
Ввиду того, что указатели на структуры используются очень часто , в языке Си есть специальная операция доступа к элементу структуры через указатель(->), позволяющая сослаться на элемент структуры, заданный указателем на нее:
имя_указателя->имя_элемента
Эта операция является первичной и находится в самой верхней строке таблицы приоритетов операций языка Си.
После того, как указатель sp инициализирован и указывает на элемент массива структур staff[0], следующие выражения эквиваленты: