На этом шаге мы рассмотрим особенности такого обращения.
Мы видели, что после объявления структуры (а это фактически тип данного, имя которого равно имени структуры) можно объявить некую переменную типа этой структуры или указатель этого типа (указатель на эту структуру).
Если вы объявили переменную типа структуры, то чтобы обратиться к элементам структуры, надо после имени переменной поставить точку, а если объявили указатель на структуру, то после имени указателя на данную стртуру надо поставить стрелку вправо (->). Затем нужно к этим именам приписать имя члена структуры, к которому надо обратиться. Если требуется обратиться к членам вложенной структуры, то следует продолжить операции точкой или стрелкой вправо с именем подструктуры, а затем с именем члена. Примеры обращения к членам экземпляров структуры: emp[0].name, emp[521].salary, emp[121].hiredate.year.
Допустим, р = &emp[1]. В этом случае:
Однако существуют некоторые ограничения:
struct r {int s; r t;};
Такое объявление структуры неверно, т. к. t не может иметь тип r. При этом указатель на тот же тип разрешен. Например:
struct r {int s; r* t;};
struct r { int s; (*comp)(char* a, char* b); }
Ниже приведен текст простейшей программы, в которой функция является членом структуры (результат работы этой программы показан на рисунке 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 считаются относящимися к шаблонам разного типа (у их шаблонов разные имена и этого достаточно, чтобы считать их разными, хотя по структуре они совпадают).
На следующем шаге мы рассмотрим структуры и функции.