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

Массивы в си Объявление и инициализация одномерных массивов в Си

В Си одномерный массив объявляется следующим образом:

ТИП_ЭЛЕМЕНТОВ ИМЯ_МАССИВА[КОЛИЧЕСТВО_ЭЛЕМЕНТОВ];

Пример:

int a[5];

float f[100];

char s[80];

Эквивалентные массивы в Паскале были бы объявлены так:

var

a: array [0 .. 4] of integer;

f: array [0 .. 99] of real;

s: array [0 .. 79] of char;

То есть если объявлен массив:

int b[10];

то в таком массиве есть 10 элементов:

b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9].

В нем нет элемента b[10].

Обращение к элементам одномерного массива в Си производится точно так же, как и в Паскале. Например, если необходимо пятому элементу массива b присвоить значение 0, то это будет выглядеть так: b[5] = 0;

В случае необходимости обработать все элементы массива используется цикл. Как правило, используется цикл for такого вида:

// Обнулить все элементы массива B

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

b[i] = 0;

Массив в Си может быть одновременно объявлен и инициализирован.

int a[10] = {5, 4, 3, 2, 3, 4, 5, 4, 3, 4};

Эта запись означает, что a[0] = 5, a[1] = 4, a[2] = 3 и так далее.

Если в инициализации массива указано чисел меньше, чем элементов, то числа присваиваются первым элементам, а остальным элементам (хвостовым), присваивается значение 0.

int b[5] = {1, 2, 3};

В этом примере b[0] = 1, b[1] = 2, b[2] = 3, b[3] = 0, b[4] = 0.

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

int c[] = {10, 11, 12, 13};

Массив c содержит 4 элемента: c[0] = 10, c[1] = 11, c[2] = 12, c[3] = 13.

Вычисление адреса элемента массива

Как уже говорилось выше, при работе с указателями используются две операции: операция взятия адреса & и операция разыменования адреса *. Рассмотрим применение этих операций к элементам массива.

long a[5];

Размещение массива A в памяти:

Адрес в памяти

Элемент массива

0100

A[0]

0104

A[1]

0108

A[2]

010C

A[3]

0110

A[3]

Объявим указатели на каждый элемент массива:

long * pa0;

long * pa1;

long * pa2;

long * pa3;

long * pa4;

Присвоим этим указателям соответствующие адреса:

Pa0 = &a[0];

pa1 = &a[1];

pa2 = &a[2];

pa3 = &a[3];

pa4 = &a[4];

Используя указатели, присвоим элементам значения 10, 20, 30, 40, 50 соответственно:

*pa0 = 10;

*pa1 = 20;

*pa2 = 30;

*pa3 = 40;

*pa4 = 50;

Адресная арифметика

В Си к указателям можно применять операции + и -. Прибавлять к указателю можно только целое число. Например, значение адреса, хранящегося в pa2, равно 0108. Значение выражения pa2 + 1 будет равно адресу 010C (а не 0109, как Вы, наверное, ожидали).

Дело в том, что при увеличении указателя на 1 производится вычисление адреса СЛЕДУЮЩЕГО элемента массива. А следующий элемент массива расположен по адресу 010C. Коротко это можно записать так: pa2 + 1 = pa3.

Соответственно, pa2 + 2 = pa4.

Если из pa2 вычесть 1, то получится адрес pa1 (0104). А если вычесть 2, то pa0 (0100).

pa2 - 1 = pa1

pa2 - 2 = pa0

Из указателя можно вычитать не только целые числа, но и другой указатель. В этом случае вычисляется, сколько элементов массива расположено между двумя указателями. Например, если из pa2 вычесть pa0, то получиться 2 – столько элементов располагается между pa2 и pa0. Соответственно, pa4 – pa0 = 4, pa3 – pa1 = 2 и т.д.

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

long * p = &a[0]; //p указывает на a[0]

p++; // после этой операции p указывает на a[1]

p--; // а после этой снова указывает на a[0]

Также указатели можно сравнивать друг с другом.

Например:

pa1<pa2 – истина

pa3>=pa0 – истина

pa0 > pa0 – ложь

pa0 >= pa0 – истина

pa1!=pa2 – истина

pa1==pa2 – ложь

pa1+1 == pa2 - истина

pa4-4 == pa0 - истина