Структуры и указатели
Цель лекции: изучить указатели на структуры, операции над указателями на структуры, взаимодействие структур и функций, указатели как компоненты структур, научиться решать задачи с использованием указателей на структуры на языке 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;
}