Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

4.2. Многомерные массивы и их инициализация

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

Рис.4.2 иллюстрирует двумерный массив b. Массив содержит три строки и четыре столбца, поэтому говорят, что это массив 3 на 4. В общем случае, массив с m строками и n столбцами называется массивом m на n.

На рис.4.2 каждый элемент массива идентифицируется как b[i][j]; здесь b имя массива, i и j его индексы, которые однозначно определяют каждый элемент в массиве b.

Рис.4.2. Двумерный массив с тремя строками и четырьмя столбцами

Многомерный массив, как и одномерный, может быть инициализирован при его объявлении. Например, двумерный массив с[2][2] может быть объявлен и инициализирован следующим образом:

int c[2][2] = {{1,2},{3,4}};

либо так

int c[2][2] = {1,2,3,4};

Значения в фигурных скобках в первом объявлении группируются по строкам.

Если для данного массива недостаточно инициализирующих значений, оставшиеся его элементы инициализируются нулями. Таким образом, объявление

int c[2][2] = {{1},{3,4}};

инициализировало бы с[0][0] единицей, с[0][1] нулем, c[1][0] тройкой и c[1][1] четверкой.

Двумерные массивы хранятся в памяти по строкам.

4.3. Объявление указателей

Си поддерживает два способа доступа к переменным:

1) прямой доступ при помощи переменных, например:

int a;

a = 5;

2) косвенный доступ с использованием указателей, который и будет рассмотрен ниже.

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

При объявлении переменной типа указатель необходимо явно определить тип данных, адрес которых будет содержать эта переменная, и имя указателя (идентификатор) с предшествующей звездочкой.

Формат объявления указателя:

тип_данных *идентификатор;

Например,

int *p1; // указатель на переменную типа int;

float *p2; // указатель на переменную типа float;

char *p3; // указатель на переменную типа char;

Символ * обязателен и идентифицирует переменную, стоящую справа от неё, как указатель.

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

Например,

int *p1, *p2;

означает создание двух указателей. Если же записать объявление так:

int *p1, p2;

то компилятор создаст один указатель (p1) и одну переменную целого типа (p2).

4.4. Операции над указателями

В Си для работы с указателями используются следующие основные операции:

1) Взятие адреса

Операция взятия адреса & является унарной операцией, которая возвращает адрес своего операнда. Используется также при вызове функции scanf, для сообщения ей ячейки памяти, в которую следует поместить введенное значение.

При работе с указателями операция взятия адреса используется следующим образом:

int *p;

int a, c[20];

p = &a;

Теперь значением указателя p является адрес целой переменной a, то есть p указывает на a.

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

a) &(a+1) // попытка взять адрес выражения

б) &5 // попытка взять адрес числовой константы 5

в) &c // т.к. имя массива является указателем-константой на первый элемент массива

Последний случай (взятие адреса массива) успешно компилируется и выполняется в Borland C++ 3.1. При этом результатом взятия адреса является указатель на первый элемент массива. Между тем, другие компиляторы могут интерпретировать подобную запись иначе, поэтому использование этой конструкции не рекомендуется.