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

Индексы у одномерных массивов в языке Си начинаются с 0, а в программе одномерный массив объявляется следующим образом:

<тип> < ID_массива>[размер]={список начальных значений};

где: тип – базовый тип элементов (целый, вещественный, символьный);

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

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

Размер массива может задаваться константой или константным выражением. Нельзя задавать массив переменного размера. Для этого существует отдельный механизм – динамическое выделение памяти.

Пример объявления массива целого типа: int a[5];

В массиве «а» первый элемент: а[0], второй – а[1], … пятый - а[4].

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

a[0]=1;

a[i]++;

a[3]=a[i]+a[i+1];

Пример объявления массива целого типа с инициализацией значений:

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

Если в группе {…} список значений короче, то оставшимся элементам присваивается 0.

Внимание. В языке С с целью повышения быстро­дей­ствия программы отсутствует механизм контроля границ изменения индексов массивов. При необходимости такой механизм должен быть запрограммирован явно.

Применение указателей

Идентификатор массива – это адрес памяти, начиная с которого он расположен, т.е. адрес его первого элемента. Работа с массивами тесно связана с применением указателей.

Пусть объявлены массив a из 5 целочисленных элементов и указатель q на целочисленные переменные:

int a[5], *q;

ID массива a является константным указателем на его начало.

a

a[0]

a[1]

a[2]

a[3]

a[4]

4000

Здесь приведено символическое изображение оперативной памяти, выделенной компилятором для объявленного целочисленного массива а[5]. Указатель а содержит адрес его начала в оперативной памяти (ОП), т.е. «символический адрес»=4000 (а=4000).

Если выполнена операция: q=а; - присваивание константы переменной, т.е. q=4000 (аналог: q=&a[0]), то с учетом адресной арифметики выражения а[i] и *(q+i) приводят к одинаковым результатам – обращению к i-му элементу массива.

Идентификаторы а и q - указатели, очевидно, что выражения а[i] и *(а+i) эквивалентны. Отсюда следует, что операция обращения к элементу массива по индексу применима и при его именовании переменной-указателем. Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: q[i] и *(q+i). Первая форма удобнее для читаемости текста, вторая - эффективнее по быстродействию программы.

Например, для получения значения 4-го элемента массива можно написать а[3] или *(а+3), результат будет один и тот же.

Очевидна эквивалентность выражений:

1) получение адреса начала массива в ОП:

&а[0]  &(*а)  а

2) обращение к первому элементу массива:

*а  а[0]

Последнее объясняет правильность выражения для получе­ния количества элементов массива с объявленной размерностью:

type x[100]; // Размерность должна быть константой

...

int n = sizeof(x) / sizeof(*x);

Указатели, как и переменные любого другого типа, могут объединяться в массивы.

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

int *a[10], y;

Теперь каждому из элементов массива можно присвоить адрес целочи­сленной переменной y, например: a[1]=&y;

Чтобы теперь найти значение переменной y через данный элемент массива а, необходимо записать *a[1].