Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на Си.doc
Скачиваний:
361
Добавлен:
02.05.2014
Размер:
1.3 Mб
Скачать

12. Лекция: Массивы и указатели.

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

-Массивы.

-Указатели.

-Динамические объекты.

-Создание динамических объектов.

-Доступ к динамическим объектам.

-Строки - дополнительные сведения о связи между указателями и массивами.

-Инициализация массивов и классы памяти.

-Функции.

-Операции с указателями.

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

Допустимо бесконечно большое число различных типов указателей и массивов. Далее следуют типовые примеры.

Указатель на основной тип:

char *p;

Переменная р является указателем на символ, т.е. этой переменной должен присваиваться адрес символа.

Указатель на указатель:

char **t;

Переменная t - указатель на указатель символа.

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

int a[50];

Переменная а - массив из 50 целых чисел.

Двумерный массив:

char m[7][50];

Переменная m - массив из семи массивов, каждый из которых состоит из 50 символов.

Массив из семи указателей:

char *r[7];

Массив r состоит из указателей на символы.

Указатель на функцию:

int (*f)();

f - указатель на функцию, возвращающую целое значение.

Массивы

Массив является сложным объектом, состоящим из объектов-компонентов, называемых элементами одного и того же типа. Простые определения массива имеют вид

Тип данных x[n1][n2]...[nk]

Где x - идентификатор, определяемый в качестве имени массива, а ni - размерности массива. Массив x называется k-мерным массивом с элементами типа тип данных. Элементы i-го измерения имеют индексы от 0 до ni-1. Тип элемента массива может быть одним из основных типов, типом другого массива, типом указателя (pointer), типом структуры (struct) или типом объединения (union). Хотя элементы массива не могут быть функциями, они могут быть указателями на функции. Ниже приведены некоторые примеры определений массива:

int page[10]; /* одномерный массив из 10

элементов, перенумерованный с 0 до 9 */

char line[81];

float big[10][10], sales[10][5][8]; /*двумерный

массив и трехмерный массив*/

Ссылки на элемент k-мерного массива x делаются с помощью следующего обозначения:

x[i1][i2]...[ik]

где ij - целое выражение, при этом 0<=ij<=nj-1, а nj - максимальное значение j-го индекса массива x. Например:

page[5]

line[i+j-1]

big[i][j]

Указывая только первые p индексов, можно ссылаться на p-мерный подмассив k-мерного массива (p<=k), например,

sales[i] /* ссылка на двумерный подмассив массива

sales */

sales[i][j] /* ссылка на одномерный подмассив */

sales[i][j][k] /* ссылка на элемент массива*/

Указатели

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

тип-данных *id1, *id2,_, *idn

Тип переменных id1, id2,_,idn определяется как тип указателей на тип-данных. Эти переменные служат ссылками на объекты типа тип-данных. Этот тип называется базовым типом переменных-указателей. Ниже приведены несколько примеров определений указателей:

int *pi, *qi;/* указатели на целые объекты */

char *c; /* указатель на символьный объект */

Динамические объекты

Указатели используются при создании и обработке динамических объектов. Заранее определяемые объекты создаются с помощью определений. Динамические объекты, в отличие от заранее определяемых, создаются динамически и явно в процессе выполнения программы. Для создания динамических объектов служат функции malloc и calloc. В отличие от заранее определенных объектов, число динамических объектов не фиксировано тем, что записано в тексте программы, - по желанию динамические объекты могут создаваться и уничтожаться в процессе ее выполнения. Динамические объекты, в отличие от заранее определенных, не имеют имен, и ссылка на них выполняется с помощью указателей.

Значение 0 может быть присвоено указателям любого типа. Это значение показывает, что данный указатель не содержит ссылки на какой-либо объект. Попытка использовать это значение для обращения к объекту может привести к ошибке, но только в операционных системах с защитой памяти. По соглашению, для обозначения константы с нулевым значением используется идентификатор NULL, описание которого находится в библиотеке stddef.h и является системозависимым.