Структуры и указатели
Цель лекции: изучить указатели на структуры, операции над указателями на структуры, взаимодействие структур и функций, указатели как компоненты структур, научиться решать задачи с использованием указателей на структуры на языке C++.
Структура – это совокупность переменных, объединенных одним именем, предоставляющая общепринятый способ совместного хранения информации. В отличие от массива, всегда состоящего из однотипных элементов, компоненты структуры могут быть разных типов и все должны иметь различные имена.
Указатели на структуры
Указатель на структуру объявляется точно так же, как и указатель на данные простых типов: используется операция '*' и указывается тип данных. Тип данных структуры указывается заданием ключевого слова struct и имени шаблона этой структуры.
ИмяСтруктурногоТипа *ИмяУказателяНаСтруктуру
Например:
struct goods *p_goods; struct student *p_stu1, *p_stu2;
Указатели на структуры могут вводиться и для безымянных (не имеющих имен) структурных типов.
Например:
struct { char *name; int age; } *person; //указатель на структуру
Если структура объявлена с помощью typedef, то при определении указателей название этого типа может использоваться без служебного слова struct.
Например:
complex *cc, *ss, comp;
При определении указателя на структуру он может быть инициализирован. Корректно в качестве инициализирующего значения применять адрес структурного объекта того же типа, что и тип определяемого указателя.
Например:
struct particle { double mass; float coord[3]; } dot[3], point, *pinega; //Инициализация указателей struct particle *p_d=&dot[1], *pinta=&point;
Значение указателя на структуру может быть определено и с помощью присваивания.
Например:
pinega=&dot[0];
При определении элемента структуры запрещено указание в качестве элемента самого себя (через структурный объект).
Например:
struct STUD { //некорректное объявление поля структуры STUD t; } a, b;
Однако элемент структуры может быть указателем на определяемую структуру.
Например:
struct STUD { //корректное объявление поля структуры STUD *pt; } a, b;
Кроме того, допустимо неполное определение типа структуры, если ее указатель является элементом другой структуры.
Например:
struct A; //неполное определение структурного типа struct B {struct A *pta;}; struct A {struct B *ptb;};
При определении структурных типов может потребоваться организация взаимных перекрестных связей между структурами двух и более разных типов. В этом случае помогает применение указателей на структуры.
Например:
struct part { double modul; struct cell *element_cell; struct part *element_part; }; struct cell { long summa; struct cell *one; struct part *two; };
Доступ к элементам структур через указатель
Указатель на структуру обеспечивает доступ к ее элементам двумя способами:
(*УказательНаСтруктуру).ИмяЭлемента
или
УказательНаСтруктуру->ИмяЭлемента
В первом случае круглые скобки необходимы, чтобы учесть приоритет операций.
Во втором случае используется операция "стрелка" ( -> ), которая называется операцией косвенного выбора элемента структурного объекта, адресуемого указателем.
Например:
(*pinega).mass эквивалентно pinega -> mass
(*pinega).coord[0] эквивалентно pinega -> coord[0]
Пример 1.
#include "stdafx.h" #include <stdio.h> #include <string.h> #include <iostream> using namespace std; struct student { char name[10]; char surname[15]; int age; } stud; //переменная stud объявлена как структура типа student int _tmain(int argc, _TCHAR* argv[]) { struct student *s; // указатель на структуру student s=&stud; // инициализация указателя strcpy(s->name,"Larry"); //обращение как к указателю на структуру strcpy(s->surname,"Johnson"); (*s).age=34; //обращение как к переменной printf("\n Имя: %s \n Фамилия: %s \n Возраст = %i", s->name,s->surname,s->age); system("pause"); return 0; }