Опубликован: 02.02.2011 | Уровень: для всех | Доступ: платный
Лекция 17:

Структуры и указатели

< Лекция 16 || Лекция 17: 123 || Лекция 18 >
Аннотация: В лекции рассматриваются определения, способы объявления, инициализация указателей на структуры, ограничения на использование указателей как типов элементов структур, методы доступа к данным структуры через указатели, использование указателей на структуры как параметров и значений функций.

Цель лекции: изучить указатели на структуры, операции над указателями на структуры, взаимодействие структур и функций, указатели как компоненты структур, научиться решать задачи с использованием указателей на структуры на языке 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;
}
< Лекция 16 || Лекция 17: 123 || Лекция 18 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Ольга Замятина
Ольга Замятина
Россия, Калиниград, РГУ им. И. Канта, 2009
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ