Указатели и структуры данных. Обращение к элементам структур

   
На этом шаге мы рассмотрим особенности такого обращения.

   
Мы видели, что после объявления структуры (а это фактически тип данного, имя которого равно имени структуры) можно объявить некую переменную типа этой структуры или указатель этого типа
(указатель на эту структуру).

   
Если вы объявили переменную типа структуры, то чтобы обратиться к элементам структуры, надо после имени переменной поставить точку, а если объявили указатель на структуру, то после имени
указателя на данную стртуру надо поставить стрелку вправо (->). Затем нужно к этим именам приписать имя члена структуры, к которому надо обратиться. Если требуется обратиться к членам
вложенной структуры, то следует продолжить операции точкой или стрелкой вправо с именем подструктуры, а затем с именем члена. Примеры обращения к членам экземпляров структуры:
emp[0].name, emp[521].salary, emp[121].hiredate.year.

   
Допустим, р=&ешр[1]. В этом случае:

  • p->adress - это адрес работника, который содержится в экземпляре структуры emp[1],
  • p->hiredate->year - год поступления на работу.

   
Однако существуют некоторые ограничения:

  • членом структуры может быть любой тип данных (int, float, массив, структура), но элемент структуры не может иметь тот же тип, что и сама структура. Например:
      struct r {int s; r t};
    

       
    Такое объявление структуры неверно, т. к. t не может иметь тип r. При этом указатель на тот же тип разрешен. Например:

      struct r {int s; r* t};
    

    Такое объявление верно;

  • в языке С членом структуры не может быть функция, а указатель на функцию может быть членом структуры. Например:
      struct r
      {
        int s;
        (*comp)(char* a, char* b);
      }
    

    Такое объявление верно;

  • в языке C++ функция может быть членом структуры. Дело в том, что в C++ структуры рассматриваются как класс, т. е. для членов структуры могут быть определены
    спецификации доступа к памяти, определяемые для членов класса: public (всегда определена по умолчанию), protected и private (их мы рассмотрим при изучении классов).

       
    Ниже приведен текст простейшей программы, в которой функция является членом структуры (результат работы этой программы показан на рисунке 1).

    // 61_1.cpp: главный файл проекта.
    
    #include "stdafx.h"
    #include <stdio.h> 
    #include <conio.h>
    using namespace System;
    
    void main()
    {
    	struct aaa 
    	{
    		 public: //определена по умолчанию (приведена для примера)
    			 int i; 
    			 int f(int а)   //функция-член структуры
    			 { // объявлена прямо в структуре
    				  return -а;
    			 };
    	} bbb;
    	int a;
    	a=bbb.f(15);
    	printf ("a=%d\n",a); 
    	_getch();
    }
    

    Архив проекта можно взять здесь.


    Рис.1. Результат работы приложения

  • в языке С внешнюю или статическую структуру можно инициализировать. Например, имеем шаблон:
      struct date {
        int day;   //день недели
        int month;   //номер месяца
        int year;   //год
        char monthname[4];   //название месяца
    };
    

       
    В этом случае можем инициализировать структуру:

      date d1 = {4, 5, 2003, "sept"};
    

       
    Инициализация массива структур будет задаваться так:

      struct a { char *s; int i; } m[3] = {"u1", 0, "u2", 0, "u3", 0 };
    
  • присваивать значения одной структуры другой разрешено только для экземпляров одной структуры. Например, существует структура:
      struct A { int i; char d } a,a1; 
    

    и

      struct В{ int i; char d } b;
    

       
    В этом случае можно выполнить а = a1; или a1 = а;. Но операцию а=b; выполнить нельзя, т. к. а и b считаются относящимися к шаблонам разного типа (у их
    шаблонов разные имена и этого достаточно, чтобы считать их разными, хотя по структуре они совпадают).

   
На следующем шаге мы рассмотрим структуры и функции.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий