Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решенные оветы на теорию Си.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
166.91 Кб
Скачать

11. Производные типы данных. Статические массивы. Особенности использования массивов в функциях.

Производные типы

Производные типы можно условно подразделить на две группы:

  • Непосредственно производные типы. Эти типы являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции преобразования типов. В группу непосредственно производных типов входят:

    • массивы

    • указатели

    • ссылки

    • перечисления

    • указатели на члены класса.

  • Составные производные типы. В группу составных производных типов входят:

    • классы

    • структуры

    • объединения

Статические массивы

Массив объявляется одним из следующих способов:

тип идентификатор [константное выражение];

тип идентификатор [] = {список элементов};

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

int x[10];

float a[]={3.5,4.5,5.5}; //размерность=3

char div[3]={' ','\n','\t'};

Элементы массивов в Си всегда нумеруются с нуля.

Синтаксис индексного выражения для обращения к элементу массива имеет следующий вид:

выражение1[выражение2]

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

Индексное выражение может иметь более одного индекса, что соответствует многомерному массиву. Синтаксис такого выражения следующий:

выражение1[выражение2][выражение3]:

Такое индексное выражение интерпретируется слева направо. Сначала вычисляется самое левое индексное выражение - выражение1[выражение2]. С адресом, полученным в результате сложениявыражения1 и выражения2, складывается (по правилам сложения указателя и целого) выражение3 и т. д. Выражение2 и последующие выражения имеют целый тип.

Элементы многомерного массива запоминаются построчно. Примеры:

char а[2][3];

float matrix[10][15];

int b[3][3]={

{1,2,3},

{4,5,6},

{7,8,9}

};

В следующем примере выполняется определение, обработка и печать статической матрицы.

#include <stdio.h>

void main () {

int b[3][3]={

{1,2,3},

{1,2,3},

{1,2,3}

};

b[0][0]=2;

b[2][2]=b[0][0]*4;

for (int i=0; i<3; i++) {

printf ("\n");

for (int j=0; j<3; j++)

printf ("%d ",b[i][j]);

}

}

Особенности использования массивов в функциях.

В языке С нельзя передать весь массив как аргумент функции. Однако можно передать указатель на массив, т.е. имя массива без индекса. Например, в представленной программе в func1()передается указатель на массив i:

int main(void) { int i[10]; func1(i); /* ... */ }

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

void func1(int *x) /* указатель */ { /* ... */ }

или как

void func1(int x[10]) /* массив определенного размера */ { /* ... */ }

и наконец как

void func1(int x[]) /* массив без определенного размера */ { /* ... */ }

Эти три объявления тождественны, потому что каждое из них сообщает компилятору одно и то же: в функцию будет передан указатель на переменную целого типа. В первом объявлении используется указатель, во втором — стандартное объявление массива. В последнем примере измененная форма объявления массива сообщает компилятору, что в функцию будет передан массив неопределенной длины. Как видно, длина массива не имеет для функции никакого значения, потому что в С проверка границ массива не выполняется. Эту функцию можно объявить даже так:

void func1(int x[32]) { /* ... */ }

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