Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Структура в языке Си






 

Структура – это совокупность взаимосвязанных элементов одного, либо разных типов. Взаимосвязь определяет порядок размещения элементов структуры. Элементы структуры объединены под одним именем. Поэтому структура трактуется не как множество отдельных элементов, а как единое целое.

Примеры структур: библиографические данные о книге; строка платежной ведомости; данные о некотором товаре; координаты точек на плоскости и т. п.;

Над структурами в языке Си стандартом ANSI определены следующие операции:

1. операции присваивания между структурами, имеющими одно и то же имя типа;

2. операции копирования;

3. передача структур в качестве параметров функциям и возврат их в качестве результата;

Кроме этих операций, к структурным переменным применимы следующие:

4. адресная операция &; (кроме битовых полей);

5. операции доступа к элементам структуры “.” и –>;

6. инициализация структурных переменных, имеющих класс auto.

В то же время к структурам нельзя применять операции отношения (т.е. нельзя сравнивать структуры).

Элементом структуры могут быть переменные базового типа, массивы, указатели, объединения, другие структуры. Однако элементом структуры не может быть структура того же типа, в которой он содержится. В то же время этот элемент может быть указателем на тип структуры, в которую он входит. Это позволяет создавать связанные списки структур.

Структура задается в программе структурным шаблоном вида:

struct book

{

char title [40];

char author [30];

float price;

}

Этот шаблон описывает структуру из двух символьных массивов и одной переменной типа float.

Имя book – это имя типа структуры, на которое впоследствии можно ссылаться, как и на имя стандартного типа.

Шаблон только описывает структуру, не вызывая никаких действий компилятора. Для того, чтобы компилятор выделил память для структуры, необходимо описать саму структурную переменную. Это описание может быть задано следующим образом:

struct book libr;

где struct book – имя_типа, libr – имя_переменной.

Можно объединить определение структурного шаблона и описание структурной переменной, например:

struct book struct

{ {

char title []; float x;

char author []; float y;

float price; float z:

} libr; } coord;

Можно также проинициализировать структурную переменную. Имя типа структуры можно опустить, т. е.

struct

{

……

……

……

} libr;

Это делается, когда используется одна структурная переменная. Список элементов, заключаемый в { } называется полями структуры. Доступ к отдельному полю осуществляется с помощью следующей записи:

libr. title

/ \

имя переменной имя поля

Указатель на структурную переменную может быть задан как:

struct book *ps;

Доступ к элементу (полю) структуры, описанной через указатель, осуществляется с помощью следующей записи:

ps--> title;

или ps--> price.

Последняя запись эквивалента (*ps). price.

Создание связанного списка структур осуществляется с помощью следующей конструкции:

struct book

{

char title [ ];

char author [ ];

float price;

struct book *next; /*указатель на следующую строку структуры */

} libr;

 

Пример 6.1: /* Передача в функцию и возврат целой структурной переменной */

# include < stdio. h>

# include < string. h>

struct book

{ char title [20];

char author [15];

float price;

}; /* внешний шаблон виден всем */

struct book func (struct book); /* прототип функции */

void main (void)

{

struct book lidr_1={“Киселев А.”,

“Избранное”,

4.25}, libr_2;

libr_2=funs (libr_1);

printf (“%-20s %-20s цена -%5.2f \ n”,

libr_1. title, libr_1. author, libr_1. price);

printf (“%-20s %-20s цена -%5.2 f \ n”,

libr_2. title, libr_2. author, libr_2. price);

}

struct book func (struct book libr)

{ strcpy (libr. title, “Язык Си”);

strcpy (libr. author, “Семенов К.”);

libr. price = 6.36;

return libr; }

 

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

func1(first. a); func2 (& second. b);

Заметим, что & ставится перед именем структуры, а не перед именем поля.

Можно в качестве формального параметра передать по значению всю структуру:

Пример 6.2:

/* Использование структуры в качестве параметра */

include< stdio.h>

struct stru {

int x;

char y; };

void f(struct stru param); /* прототип функции */

main (void)

{

struct stru arg;

arg. x =1;

arg. y = ‘2’;

f(arg);

return 0;

}

void f(struct stru param)

{

printf (”%d %d \n”, param. x, param. y);

}

Можно также создать указатель на структуру и передавать аргумент типа структуры по ссылке. Объявить указатель на структуру можно следующим образом:

struct stru *adr_pointer;

struct stru – переменная типа указатель на структуру struct stru.

Если мы передаем структуру по значению, то все элементы структуры заносятся в стек. Если структура простая и содержит мало элементов, то это не так страшно. Если же структура в качестве своего элемента содержит массив, то стек может переполниться.

При передаче по ссылке в стек занесется только адрес структуры. При этом копирования структуры не происходит, а такие появляется возможность изменять содержимое элементов структуры.

struct complex {

float x;

float y; } c1, c2;

struct complex *a; /* объявление указателя */

a = & c1;

Указателю a присвоится адрес переменной с1. Получить значение элемента можно так:

(*а). x;

Кроме данного способа получить значение, мы можем использовать так же оператор а --> х, который обычно и применяется, т. е. (*а).х эквивалентно а --> х.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.