Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прилож В1 Описание языка С ч 1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
200.19 Кб
Скачать

4. Массивы в языке с

Массив – набор значений одного типа, обозначенных общим именем.

Например: массив X = {x1, x2, … , x50} = {xi}, i = 1…50

Размерность массива – количество индексов у элемента массива.

X = {xi} – одномерный массив ( Вектор )

Y = {yij} – двухмерный массив ( Матрица )

Z = {zijk} – трёхмерный массив ( Куб чисел )

Y, Z – многомерные массивы.

В программе на языке с все массивы должны быть описаны.

Одномерные массивы

Форма описания одномерного массива:

тип имя [к];

где к – количество элементов в массиве, целое число.

int p[10];

float x[50];

Начальный индекс элемента массива всегда равен 0.

p[0] p[1] … p[9]

x[0] x[1] … x[49]

Инициализация массива (задание его элементам начальных значений):

тип имя [k] = { конст1, конст2, …, констК};

int d[5] = {-1, 2, 7, -4, 10};

d[0]= = -1 d[1]= = 2 d[2]= = 7 … d[4]= =10

Для работы с одномерными массивами чаще всего используются простые циклы типа for, параметром которых является индекс элемента массива. Например: необходимо вычислить и вывести на экран элементы одномерного массива y[30].

float y[30];

int i;

for (i=0; i<30; i++)

{ y[i] = 1.5*sin(2.1*i);

printf(“y[%d]=%.3f\n”, i, y[i]);

}

Многомерные массивы

Виды многомерных массивов:

а) двухмерные массивы {aij} – матрицы

б) трёхмерные массивы {bijk} – куб чисел

в) четырёхмерные массивы {cijkl} и т.д.

Форма описания многомерного массива:

тип имя [k1] [k2] … [kn];

где ki – количество элементов по i-му индексу.

Общее число элементов многомерного массива равно

kобщ = k1*k2*…*kn

int d[5][10]; kd = 50 эл-тов.

float x[7][10][5]; kx = 350 эл-тов.

Начальные индексы у элементов многомерных массивов равны 0.

Индексы для элементов массива d[5][10]:

d [0][0] d[0][1] d[0][2] … d[0][9] d[1][0] … d[4][9]

Индексы для элементов массива x[7][10][5]:

x[0][0][0] x[0][0][1] ……………x[6][9][4]

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

Инициализация многомерных массивов:

int t[3][4] = { {2, 7, -1, 10},

{5, 12, 18, -3},

{11, -8, 25, 4} };

Для работы с многомерными массивами чаще всего используются сложные циклы for. Количество операторов цикла for равно размерности массива. Параметрами этих циклов являются индексы элементов массива. Например: необходимо вычислить и вывести на экран элементы двухмерного массива z[5][7].

int i, j;

float z[5][7];

printf(“Массив Z\n”);

for (i=0; i<5; i++ )

{

for (j=0; j<7; j++ )

{

z[i][j]=-1.9*i + 2.5*j;

printf(“%.1f “, z[i][j]);

}

printf(“\n”);

}

5. Операции с адресами. Указатели.

В языке С есть две адресных операции.

1. Получение адреса переменной V - &V

Результат операции – физический адрес переменной V в памяти компьютера.

Пример: вывести на экран значения и адреса в памяти переменных p, y, z, m.

int p=25;

float y=371.9;

double z=18.469E-12;

char m=’+’;

printf (“Переменная Значение Адрес \n”);

printf (“ P %10d %u\n”, p, &p);

printf (“ Y %10.1f %u\n”, y, &y);

printf (“ Z %10.3e %u\n”, z, &z);

printf (” M %10c %u\n”, m, &m);

Распределение памяти:

p y z m

25

371.9

18.469E-12

+

Адреса: 6921 → 6921+2 → 6923+4 → 6927+8

На экран будет выведена следующая информация:

Переменная Значение Адрес

P 25 6921 Y 371.9 6923

Z 18.469е-12 6927

M + 6935

2. Получение значения по адресу, заданному Р - *Р

где Р – указатель или адресное выражение.

Результат операции – из памяти считывается значение, хранящееся по адресу Р.

Указатель это специальный вид переменной, которая может хранить адрес.

Форма описания указателя:

тип *имя;

где имя – любой идентификатор, рекомендуется обозначать указатели следующим

образом: ptr pt_a pt_x ptr_k (ptr сокращение от английского pointer).

int m=125, *ptr_m;

float b=221.9, *ptr_b, c;

ptr_m=&m;

ptr_b=&b;

c=*ptr_b;

Адресные операции используются при работе с функциями для передачи адресов параметров, например:

scanf(“%f%d”, &z, &k);

Указатели и массивы

1. В языке С имя массива – это указатель-константа на начало массива int p[10]; p= =&p[0]

float a[5][7]; a= =&a[0][0]

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

a[i] = =&a[i][0] – адрес i-й строки

2. С элементами массивов можно работать через указатели. Для этого указателю необходимо присвоить адрес начала массива, а затем можно получить доступ к любому его элементу путем прибавления к указателю индекс этого элемента.

В одномерном массиве x[25] расположение элементов следующее: x x[0] x[1] …. x[24]


float x[25], *ptx; ptx = x;

i-й элемент массива: x[i] → *(ptx+i)

В адресном выражении (ptx+i) - +1 – это увеличение адреса на длину float

x[5] → *(ptx+5)

В двухмерном массиве m[5][6] расположение элементов следующее:

m00 m01 m02 …. m05 m10 m11 m12 … m45

int m[5][6], *ptm;

ptm=m;

i-й j-й элемент массива: m[i][j]→ *(ptm+i*6+j)

В адресном выражении (ptm+i*6+j) к адресу начала массива ptm прибавляется смещение на количество предыдущих строк i*6 и смещение по текущей строке j.

m[1][2] = = *(ptm+1*6+2)