Структуры в Си и их передача
Структура в Си - тип данных, предназначенный для размещения значения разного типа в одном объекте. Полезен, когда необходимо объединить несколько переменных с разными типами под одним именем. Делают программу более компактной, ею удобней управлять. Структура имеет схожие особенности с массивами и классами.
Массивы
Прежде чем говорить о структуре в Си, нужно описать массив.
Существуют массивы одномерные, двумерные, трехмерные. Одномерный - это такой, у которого есть только одна строка с заполненными значениями. Двумерный - одномерный массив, внутри которого находятся другие одномерные массивы.
Обычный массив в Си записывается так: int a[4] = {1, 2, 3, 4}.
Видим, что a - имя, int - тип данных, внутри фигурных скобок { } находятся значения, между квадратными скобками [ ] указывается длина, то есть количество элементов. Количество элементов является статическим, равняется 4. Это означает, что если в этом примере пользователь добавит пятое значение, компилятор выдаст ошибку. Если изначально не известно количество, они могут быть добавлены позже, но в квадратных скобках не ставится значение.
Двумерный объявляется похожим образом. Например, массив, который содержит 5 элементов-массивов, при этом каждый содержит по 3 элемента объявляется так: int a[5][3].По аналогии с одномерным добавлять ничего нельзя, чтобы не получить ошибку компилирования.
Различают динамические и статические. Статический - это такой, который вмещает фиксированное количество данных, то есть имеет постоянную длину. Под динамическим понимается тот, размер которого не ограничивается, он может меняться во время выполнения программы. Инициализация динамического массива происходит без указания точного количества.
Классы
Класс и структура похожи по между собой, но отличаются некоторыми нюансами. Что это такое? Это абстракция, описывающая методы еще не существующего объекта. После создания объект или, как он называется по-другому, экземпляр класса имеет конкретные свойства. Методы могут использоваться внутри, снаружи или при наследовании.
Класс объявляется так:
class /*class name*/
{
private:
/* спецификатор доступа private обозначает, что управление методами возможно только внутри класса*/
public:
/* делает свойства доступными для других частей кода */
protected:
/* наследуемые классы получают возможность использовать эти свойства */
}.
Что такое структура в языке Си
Предназначена для хранения несколько типов данных. Например, чтобы создать каталог журналов, нужно иметь список с такими параметрами:
- дата издания;
- номер выпуска;
- название;
- стоимость.
Для решения этой задачи можно было бы применить массивы.
Объявляем массив с датами int date[20], номерами int number[20], названиями char title[80], стоимостью int price[20].
Обращаясь по индексу, мы получаем требуемую информацию. Вывод информации о произведении под номером 3 выглядит так: cout << “дата выпуска: ” date[3] “, номер: ” number[3] “, название: ” title[3] “, стоимость: “ price[3]).
Структура упрощает запись, описывается следующим образом:
struct book {
int date;
int number;
char title[20];
int price[20];
}.
Видим одно из главных преимуществ - присутствуют разные типы переменных. Программист не просто экономит время - он упрощает код, в дальнейшем ему будет намного проще работать.
Объявление
Структуры в Си играют очень важную роль - объединение данных различного типа.
Для начала нужно указать имя структуры и свойства.
struct name
{
type member;
}
Struct - ключевое слово, оно начинает объявление, name - имя, type - тип данных, member - имя элемента.
Объявляется так:
name name2, где name - заданное при создании структуры имя, а name2 - имя переменной.
Объявить переменные можно на этапе создания.
struct name
{
type member;
} name2;
Первый и второй пример равносильны друг другу.
Если есть необходимость объявить несколько переменных, они перечисляются через запятую.
struct name
{
type member;
} name2, name3, name4.
Инициализация
После объявления структуру в Си необходимо инициализировать.
struct name
{;
char member
};
name name2;
name2.member=”a”;
Инициазация может происходить при создании.
struct name
{
char member = “a”;
} name2;
У структуры такой же синтаксис, как у класса. У них практически одинаковое поведение, возможности. Все, что находится в теле класса, по умолчанию недоступно для использования другими объектами.
У структуры все наоборот - все поля и методы являются публичными. Вручную можно задать модификатор доступа private и таким образом открыть доступ другим функциям или классам.
Массив структур Си
Массивы - это множество компонентов одного типа. Они располагаются рядом с друг другом, обращение к каждому из них осуществляется по числовому индексу. Существуют одномерные массивы, двумерные, трехмерные.
У одномерного только одна строка и n-e количество элементов. Объявление выглядит так:
int a[16];
Массив структур в Си объявляется так:
struct MyStruct
{
int a;
};
MyStruct obj1[10];
В этом примере мы создали MyStruct с элементом целочисленного типа под именем "а". Объявляем переменную obj1[] - она является массивом, состоит из 10 элементов.
При объявлении нескольких массивов одного типа используется MyStruct obj1[10], obj2[5], инициализация происходит во время объявления. Выглядит так:
struct MyStruct
{
int a;
} obj1[10];
Создание массива структур с динамическим выделением памяти выглядит точно также, как создание простого динамического массива. Для этого применяется указатель на структуру Си.
Указатель - это переменная, которая не содержит значения, а указывает на ту переменную, которая имеет какое-то значение. Соответственно, указатель содержит адрес этой переменной, на которую ссылается. Например, ptr = &var1 означает, что переменной со знаком амперсанда присвоен только адрес на переменную, но не само значение. Теперь все значения var1 доступны через переменную-указатель ptr.
Операция * отсылает к содержимому ячейки, на которую указывает переменная после этого символа. Например, *ptr говорит о том, что здесь содержатся значения, взятые из ячейки с адресом к ptr.
Чтобы выделить память для динамических переменных, используют операцию new.
У нас есть
struct MyStruct
{
string a;
}
Выделяем участок памяти, заносим туда некое значение MyStruct * point = new MyStruct[1];
Для удаления динамических переменных используем операцию delete. Чтобы освободить место, вводим delete p[];
Доступ
Все элементы по умолчанию являются публичными, поэтому другие классы их могут использовать. Чтобы задать или изменить некоторые значения, сначала нужно обратиться к элементу и только потом произвести соответствующие действия.
Создаем myStruct с именем переменной b.
struct myStruct {
string fio;
long num;
} b;
Обращаемся к fio:
b.fio
и задаем произвольное значение. Например, b.fio = “Ivanov”.
Рассмотрим такой пример.
struct myStruct {
string fio;
long num;
} tel[2]={
{ "Иванов", 456756 },
{ "Петров", 632345 }
};
В данном примере у нас есть массив структур со строками и числами. Чтобы вывести на экран фамилию Иванов, используем следующее:
cout << myStruct tel[1].fio;
Когда захотим получить значение 456756, выполняем cout << myStruct tel[1].num.
Структура и функции
Может использоваться, как аргумент функция в структуре в Си.
struct myStruct {
char text[100];
int value;
};
Имеем переменную value, строку text на 100 символов. Создаем переменную menu типа myStruct: myStruct menu. В следующем примере функция принимает указатель на структуру как аргумент, а в теле безымянной функции происходит инициализация этих переменных.
void item(myStruct menu)
{
sprintf(menu.text,"One item");
menu.value=50;
}.
Заключение
Структура - это такой набор, наподобие массива, но при этом все элементы могут быть разного типа. Очень похожа на класс, но отличается тем, что свойства по умолчанию доступны для использования другими классами, то есть имеют спецификатор public.
Создается с помощью ключевого слова struct, а внутри фигурных скобок { } указываются свойства.
struct name
{
int member;
};
Объявление происходит на этапе создания или после.
struct name
{
int member;
} a;
или
struct name
{
int member;
} a;
struct name a.