.: [предыдущая | оглавление | следующая] :.

2.6. Объявления

2.6.1. Типы объявлений

Возможны объявления:

  1. переменных;
  2. функций;
  3. типов;
  4. структур;
  5. битовых полей;
  6. объединений;
  7. массивов.

2.6.2. Объявление переменных

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

Имеются следующие определенные типы данных: char, int, signed, double, long, unsigned, float, short.

Переменные могут быть объявлены следующим образом:
char c; //объявить переменную с типа char;
int i, j; //объявить переменные i и j как целые;
double f; //объявить переменную f плавающего типа
long L; // объявить переменную L типа длинного целого

2.6.3. Объявление массивов

Массив - это объект в Си, содержащий последовательность однотипных элементов. Важно отметить, что элемент массива также является объектом. Взять значение элемента массива можно по номеру, называемому индексом. Для объявления массива необходимо указать тип элементов массива и его размерность. Например:
int vec[10];

В этом объявлении описан целый массив с именем vec, размерность этого массива 10 элементов. Первый элемент массива имеет индекс 0, второй элемент 1 и т.д. Чтобы взять значение элемента массива, необходимо записать имя массива и в квадратных скобках указать номер элемента, например:
j=vec[0]; //j присвоить значение первого элемента массива;
k=vec[9]; //k присвоить значение последнего элемента массива.

Вместо константы при записи индексов может стоять выражение.
Например:
vec[i]=i; /*берется значение i, определяется
соответствующий элемент массива и
присваивается значение переменной i.*/
vec[j*2+1]=0; /*вычисляется значение выражения в квадратных
скобках, это будет индекс элемента массива и
этому элементу массива присваивается значение 0.*/

Можно объявить многомерный массив, например матрица с именем Matr может быть объявлена так:

int Matr[5][10]; //здесь объявлена матрица размерностью 5 * 10 целых элементов.

Иными словами можно сказать, что объявлено 5 векторов размерностью 10. Можно объявить трехмерный массив, например:

int Tenz[2][5][10] ; //объявлено две матрицы размерность 5 * 10 целых элементов

Доступ к элементам многомерных массивов аналогичен доступу к элементам в одномерном массиве. Присвоение начальных значений для массивов производится следующим образом: объявляется массив и в фигурных скобках записываются значения элементов массива, разделенных запятой.
Например:
int vector[5]= { 1, 2, 20, -5, 8 };

Тогда vector[0] равен 1, vector[1] равен 2, vector[2] равен 20, vector[3] равен -5, vector[4] равен 8. Для матрицы можно записать начальные значения построчно, например:

double ObrMatr[2][3]=   {{ 1.0, 2.0, 8.5 } //первая строчка
                        { 2.9, 1.9, 3.4 } //вторая строчка
                        };

Тогда ObrMatr[0][0] равен 1.0, ObrMatr[0][1] равен 2.0, ObrMatr[0][2] равен 8.5, ObrMatr[1][0] равен 2.9, ObrMatr[1][1] равен 1.9, ObrMatr[0][1] равен 3.4.

2.6.4. Объявление строк символов

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

char str[20];//объявить строку символов длинной 20

Важно помнить, что строка символов - это тот же массив, только на него накладывается ограничение, последним элементом строки символов должен быть ноль. Например:

char str[20]={"привет"};

Это означает, что str[0] равен ’п’, str[1] равен ’р’, str[2] равен ’и’, str[3] равен ’в’, str[4] равен ’е’, str[5] равен ’т’, str[6] равен 0. Остальные значения элементов неопределенны и могут иметь самые разные значения.

Важно отметить, что для строк символов существует достаточно большая библиотека стандартных функций, которые описаны в специальном файле string.h

2.6.5. Объявление структур

Структура - это конструируемый тип, который описывает объект, содержащий некоторое количество разнотипных объектов. Например, если необходимо записать обобщенную информацию об адресе человека, то необходимо указать:

  • фамилию, имя, отчество,
  • город, улицу, номер дома, номер квартиры,
  • почтовый индекс,
  • телефон домашний,
  • телефон рабочий,
  • адрес электронной почты и т.д.

Мы бы хотели, чтобы это вся эта информация была воспринята как один объект (один сплошной участок памяти), то в Си необходимо записать структуру:

struct Address
{
      char Name1[20]; //
имя
      char Name2[20]; //фамилия
      char Name3[20]; //отчество
      char Town[30]; //город
      char Street[30]; //улица
      int Home; // номер дома
      int Flat; // номер квартиры
      long HomeTelephone; // номер домашнего телефона
      long WorkTelephone; //номер рабочего телефона
      char Email[100]; //электронная почта
};

Записав описание структуры, можно объявить соответствующие объекты, например: struct Address p1, MyAddress, AddressBook[10]; тогда к элементам структурных объектов можно обращаться следующим образом: первоначально записывается имя объекта, затем точка, затем имя элемента. Например:

p1.Home=28;
MyAddress.Flat=53;
AddressBook[0].WorkTelephone=233456;

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

struct Address MyAddress={ “Кручинин”, “Владимир”, “Викторович”, “Томск”, “Киевская”, 28, 53, 249604, 413572, “kruvv@mail.ru” };

Для массивов структур правило записи аналогично массивам:

struct Address AddresBook[10]= {{начальные значения для первого элемента}, { начальные значения для второго элемента }, ... { начальные значения для последнего элемента }};

2.6.6. Объявления объединений

Объединение предназначено для создания объекта, который может иметь несколько типов. Например, можно создать объект, который рассматривается как целое число и как массив, состоящий из двух байтов.

Объединение записывается как структура, только вместо ключевого слова struct записывается ключевое слово union. Например:

union xxx { int k; char s[2] };

В этом примере объединение xxx можно воспринимать как целое или как массив из двух байт. Причем изменение в k ведет к изменению в массиве и наоборот.

Например, xxx.k=10; при этом присваивании xxx.s[0] равно 0, а xxx.s[1] будет равно 10. Если xxx.k=256, то xxx.s[0] равно 1, а xxx.s[1] равно 0. (в этом примере предполагается, что целое занимает 16 бит). Можно объединять любое количество элементов. Размер памяти, занимаемой объединением, равен элементу с максимальным размером.

2.6.7. Объявление собственного типа (typedef)

В Си предусмотрена возможность объявления собственного типа. Это делается с помощью специального ключевого слова typedef. Например:

typedef struct TagPoint
{
      int x;
      int y;
      int color;
} POINT;

В этом примере объявлена структура TagPoint как новый тип POINT. Тогда можно объявить объекты нового (пользовательского) типа. Например:

POINT t, z, Izo[10][10];

Обращение к соответствующим элементам записывается по правилам обращения к элементам структуры, например: t.x или t.y или Izo[i][j].x.

2.6.8. Битовые поля

Можно объявить целые знаковые и без знаковые числа как битовые поля. Например:

struct MyStruct {

int i

:2;

unsigned j

:5;

int

:4;

int k

:1;

int m

:4;

}

a,b,c

В этой записи объявлены три битовых поля a, b и c. Распределение битов начинается с самого младшего (0-го бита). Длина (количество бит, выделенных для данной переменной) записывается через двоеточие (см. выше). Ниже показано битовое распределение в 16-разрядном целом числе битовых полей a, b, c.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
x x x x x x x x x x x x x x x x
m k не используется j i

Переменные битовых полей могут быть знаковыми и без знаковыми. Если размер переменной битового поля равен 2, и ее значение «11», то для знакового это будет (-1), а для без знакового будет 3. Если встретится, например, a.i=6; то в результате выполнения будет a.i, равное (-2), поскольку 6 - это двоичное 110, ширина i равна двум, после присвоения a.i будет содержать битовое 10, и i объявлена как int, тогда битовое 10 будет интерпретироваться как -2.

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

Следует предупредить, что выражение &mystruct.x является ошибочным, если х есть идентификатор битового поля. Поскольку оно не гарантирует, что может вычислить адрес этого элемента.

.: [предыдущая | оглавление | следующая] :.