Лекция: Общее знакомство

Вид материалаЛекция

Содержание


Встроенные макроимена
Указатели и массивы
Массив r состоит из указателей на символы. Указатель на функцию
Массив является сложным объектом, состоящим из объектов-компонентов, называемых элементами одного и того же типа. Простые опреде
Динамические объекты
Подобный материал:
1   ...   20   21   22   23   24   25   26   27   ...   33
^

Встроенные макроимена


Существуют встроенные (заранее определенные) макроимена, доступные препроцессору во время обработки. Они позволяют получить следующую информацию:

_DATA_ - строка символов в формате: "месяц число год", определяющая дату начала обработки исходного файла. Например, после препроцессорной обработки текста программы, выполненной 29 января 2005 года, оператор

printf(_DATA_);

станет таким

printf("January 29 2005");

_LINE_ - десятичная константа - номер текущей обрабатываемой строки файла с программой на Си. Принято, что номер первой строки исходного файла равен 1;

_FILE_ - строка символов - имя компилируемого файла. Имя изменяется всякий раз, когда препроцессор встречает директиву #include с указанием имени другого файла. Когда включения файла по команде #include завершаются, востанавливается предыдущее значение макроимени _FILE_;

_TIME_ - строка символов вида "часы:минуты:секунды", определяющая время начала обработки препроцессором исходного файла;

_STDC_ - константа, равная 1, если компилятор работает в соответствии с ANSI-стандартом. В противном случае значение микроимени _STDC_ не определено. Стандарт языка Си предполагает, что наличие имени _STDC_ определяется реализацией, так как макрос _STDC_ относится к нововедениям стандарта. В конкретных реализациях набор предопределенных имен гораздо шире. Для получения более полных сведений о предопределенных препроцессорных именах следует обращаться к документации по конкретному компилятору.

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. Его описание имеет следующий вид:

#define NULL 0

и содержится среди описаний файла стандартного пакета ввода-вывода stdio.h.